Я бы почти рекомендовал не использовать поток, однако, если вы все еще хотите это сделать, один из очень простых способов связи между вашей основной программой и вашим потоком - через события потоков.На самом деле это просто логическое событие (включено или выключено), и вы можете действовать, когда событие установлено.Вот ваша оригинальная программа, обновленная для использования этого:
class RunMonitor(threading.Thread):
def __init__(self, quit_event):
threading.Thread.__init__(self)
self.quit_event = quit_event
def run(self):
print 'Invoking the command prompt .....'
subprocess.call(["start", "/DC:\\Scripts", "scripts_to_execute.bat"], shell=True)
self.quit_event.set()
def runscript(self):
print 'Complete_file_Path inside Run script is : ' , self.complete_file_path
file_operation.Generate_Bat_File(self.complete_file_path)
quit_event = threading.Event()
run_monitor_object = RunMonitor(quit_event).start()
while True:
if not quit_event.is_set():
print 'The thread is still alive....'
else:
print 'The Thread is not alive anymore'
self.run_button.setEnabled(True)
break
Итак, по существу, перед тем, как запустить поток, вы создаете объект threading.Event()
и передаете его в свой поток.Как только это событие создано, вы можете .set()
его «включить» событие, основная программа просто ждет, когда это произойдет.
Как я уже сказал, это очень просто, это просто логическое событие.Если вам нужно что-то более сложное, вы можете добавить больше событий или использовать threading.Queue()
.
[EDIT] Вот полностью рабочий пример, который я создал (вместо того, чтобы пытатьсядобавьте все в ваш образец):
Вот файл python, обратите внимание на изменение в строку subprocess.call
:
import threading
import subprocess
import time
class RunMonitor(threading.Thread):
def __init__(self, quit_event):
threading.Thread.__init__(self)
self.quit_event = quit_event
def run(self):
print 'Invoking the command prompt .....\n'
subprocess.call(["start", "/WAIT", "/DC:\\python27\\sample", "xxx12.bat"], shell=True)
self.quit_event.set()
class Something:
def runscript(self):
print 'Starting the thread...'
quit_event = threading.Event()
run_monitor_object = RunMonitor(quit_event).start()
while True:
if not quit_event.is_set():
print 'The thread is still alive....'
else:
print 'The Thread is not alive anymore'
break
time.sleep(1)
runme = Something()
runme.runscript()
Обратите внимание, что я добавил режим сна в основной циклтак что консоль не заполняется сообщениями «Поток еще жив ...».
Кроме того, для справки приведен мой командный файл (я назвал его xxx12.bat, как указано в pythonкод), я просто использовал это, чтобы вызвать задержки, чтобы я мог доказать, что поток завершается правильно:
echo wscript.sleep 2500 > xxx12.vbs
start /wait xxx12.vbs
dir c:\
start /wait xxx12.vbs
dir c:\
start /wait xxx12.vbs
dir c:\
start /wait xxx12.vbs
dir c:\
start /wait xxx12.vbs
dir c:\
exit
Здесь важно отметить, что команда 'exit' в этом пакетном файле является жизненно важной, еслимы не говорим, что вызов подпроцесса никогда не прекратится.Надеюсь, этот пример поможет.