我有一个问题:我的主线程应该启动并加入一个运行大约10-15秒的线程。
所以:
我的代码的问题是 Trovarete_Window出现并且仅在工作人员功能已经结束时才开始更新 。所以我的程序会挂起/冻结,直到工人运行。
这是我的代码:
def collega_GUI(widget, args=()):
builder.get_object('Trovarete_Window').show_all()
progressbar.set_pulse_step(0.20)
pulse()
t = threading.Thread(target=worker)
t.setDaemon(True)
t.start()
t.join()
print 'a'
def pulse():
if not event.is_set():
progressbar.pulse()
GObject.timeout_add(300, pulse)
def worker():
#hard work
答案 0 :(得分:1)
问题是您在t.join()
内呼叫collegea_GUI
。调用t.join()
表示您的主线程 - 运行事件循环的线程 - 在worker
完成之前被阻止。只要您在collegea_GUI
内被阻止,您的主循环就无法运行,这意味着您调度的pulse
的调用无法运行,并且GUI无法运行更新。
您不需要调用t.join()
,而是需要执行类似于您使用pulse
执行的操作 - 安排运行的函数执行非阻塞检查看看worker
是否完成。像这样:
def collega_GUI(widget, args=()):
builder.get_object('Trovarete_Window').show_all()
progressbar.set_pulse_step(0.20)
pulse()
t = threading.Thread(target=worker)
t.setDaemon(True)
t.start()
wait_for_t(t)
def wait_for_t(t):
if not t.is_alive():
t.join() # This won't block, since the thread isn't alive anymore
print 'a'
# Do whatever else you would do when join() (or maybe collega_GUI?) returns
else:
Gobject.timeout_add(200, wait_for_t, t)