class DemoFrame(wx.Frame):
def __init__(self):
Initializing
...
self.TextA = wx.StaticText(MainPanel, id = -1, label = "TextAOrWhatever")
self.TextB = wx.StaticText(MainPanel, id = -1, label = "TextBOrWhatever")
...
def StaticTextUpdating(self, ObjectName, Message):
ObjectName.SetLabel(Message)
def WorkerA(self):
while True:
Work on something
UpdatingThread = threading.Thread(target = self.StaticTextUpdating, args = (self.TextA, "Something for TextA",))
UpdatingThread.start()
time.sleep(randomSecs)
def WorkerB(self):
while True:
Work on something
UpdatingThread = threading.Thread(target = self.StaticTextUpdating, args = (self.TextB, "Something for TextB",))
UpdatingThread.start()
time.sleep(randomSecs)
...
def StartWorking(self):
Spawn WorkerA thread
Spawn WorkerB thread
...
正如你所看到的,我總是更新新主題StaticText
,我100%肯定在任何特定的時間點,只有一個線程更新的特定對象,但問題是,每隔一段時間運行一段時間後,一些物體就會消失。這是爲什麼發生?這是否意味着GUI更新不是線程安全的?也許只有一個對象可以在某個時間點更新?
補充:
OK,wx.CallAfter應該是上面的代碼一個很好的解決方案。但是我還有一個問題,如果一個按鈕事件和SetLabel
同時發生了什麼?這樣的事情會不會引起麻煩,儘管我沒有看到任何問題?
wx.CallAfter在UI線程中序列化方法調用。由於事件是在UI線程中分派的,因此如果使用wx.CallAfter,它們不會「同時」發生。如果你不是,那麼在一些線程中發生的事情可能會引發一堆問題。例如,想想MS-Windows上的DC重用。或者2個線程試圖同時寫入Linux上的相同套接字(連接到X服務器)... – fraca7
@ fraca7:非常感謝! – Shane