我有一個問題:我的主線程應該啓動並加入一個線程,該線程運行約10-15秒。GObject.idle_add(),thread.join()和我的程序掛起
所以:
- 我主線程啓動子線程,其中具有運行約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'叫什麼?主循環在哪裏開始? – dano 2014-10-03 01:38:59
另外,你需要從'worker',它需要主線程阻塞,直到它完成?你真正的程序如何真正從工作者線程獲得結果? – dano 2014-10-03 01:42:56
1)從Gtk.Button調用collega_gui。 2)當子線程結束時,它會設置一個結果變量。該變量由函數返回,在join()之後調用。 – FrancescoN 2014-10-03 01:49:26