【发布时间】:2014-11-28 02:35:54
【问题描述】:
我有一个问题:我的主线程应该启动并加入一个运行大约 10-15 秒的线程。
所以:
- 我的主线程启动一个子线程,它必须运行大约 10-15 秒
- 我的主线程加入子线程:主线程需要子线程的结果
- 在子线程运行的同时,我要更新 GUI,它只是一个进度条(可能每 0.2 秒)
- 更新 GUI:我将使用 递归函数
- 子线程结束,主线程得到结果
我的代码的问题是 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
【问题讨论】:
-
collega_GUI在哪里调用?主循环从哪里开始? -
另外,您需要
worker提供什么要求主线程阻塞直到完成?您的真实程序实际上是如何从工作线程中获取结果的? -
1) collega_gui 是从 Gtk.Button 调用的。 2)当子线程到达终点时,它会用结果设置一个变量。该变量由函数返回,在 join() 之后调用。
-
已添加。这通常是在 GUI 事件处理程序中调用 join() 时发生的情况。不要在 GUI 事件处理程序中等待。不要拨打阻塞电话,不要睡觉,不要调用 join()。
标签: python multithreading gobject