我正在 pygtk 中開發一個多線程應用程序,快速使用並卡在線程中。所以我正在嘗試各種可能性,發現我的線程只有當我在 gui 中執行某些操作時才工作這是我的程式碼
t = threading.Thread(target=self.calc,args=(treeiter))
t.daemon = True
t.start()
def calc(self,treeiter):
store=self.builder.get_object('liststore1')
per=0
while 1:
print "Calcing and changing percent,per="+str(per)
tore.set_value(treeiter,4,str(int(per))+"%")
per+=1
time.sleep(1)
我正在嘗試按線程更新值liststore
,但只有當我單擊某個按鈕或其他一些 gui 事件時它才會更新,為什麼會這樣?為什麼執行緒不在後台運行?
答案1
線程和 GTK 並不總是能夠很好地結合在一起。有一些技巧可以提供幫助,但如果出現奇怪的錯誤,請不要感到驚訝。我最近從應用程式中刪除了所有線程,感覺好多了。
因此,您應該考慮的第一件事是是否可以重寫應用程式以利用 GLib 非同步方法。
如果您堅持使用線程,請記住以下兩個規則:
- 在程式碼中儘早呼叫 GLib.treads_init()
- 在執行緒中呼叫 GUI 事件時,將它們包裝在 GLib.idle_add() 中
這些是規則,而不是指導方針。你必須總是使用執行緒時執行此操作。
答案2
當您使用 gtk 時,使用 time.sleep() 並不是一個好主意。您可以嘗試使用計時器事件。 (我不再使用得很快,但我認為這應該有用。)
from gi.repository import GLib
class Just_for_correct_coding():
self.per = int()
def start(self):
GLib.timeout_add_seconds(1, self.calc)
def calc(self,treeiter):
store=self.builder.get_object('liststore1')
print "Calcing and changing percent,per="+str(self.per)
tore.set_value(treeiter,4,str(int(self.per))+"%")
self.per+=1
return True #important if you want to keep the timer running