我有一個程序(時間間隔製造商)有兩個線程更新wx.StaticBitmap
。 當兩個線程訪問wx.StaticBitmap
它與誤差崩潰蟒蛇線程崩潰
蟒:xcb_io.c:221:poll_for_event:斷言`(((長) (event_sequence) - (長)(dpy->請求))< = 0)'失敗。
我試圖尋找答案一Google search,我試圖解決它自己,但我仍然無法弄清楚。
一段簡單的代碼再現此錯誤(這是不實際的程序):
#!/usr/bin/env python
import wx
import time,os.path,glob,threading
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.bitmap_1 = wx.StaticBitmap(self, -1, wx.NullBitmap)
self.__set_properties()
self.__do_layout()
wx.CallAfter(self._img)
def __set_properties(self):
self.SetTitle("frame_1")
def __do_layout(self):
sizer_1 = wx.BoxSizer(wx.VERTICAL)
sizer_1.Add(self.bitmap_1, 0, 0, 0)
self.SetSizer(sizer_1)
sizer_1.Fit(self)
self.Layout()
def _img(self):
Thread1= threading.Thread(target=self._img1)
Thread1.start()
Thread2 = threading.Thread(target=self._img2)
Thread2.start()
def _img1(self):
frames = glob.glob("/path/to/pngs/*.png")
frames.sort()
for i in range(len(frames)):
if os.path.isfile(frames[i]) and i%2 == 0:
print frames[i]
wx.Yield()
##time.sleep(0.5)
wx.CallAfter(self.bitmap_1.SetBitmap,wx.Bitmap(frames[i], wx.BITMAP_TYPE_ANY))
wx.CallAfter(self.Update)
def _img2(self):
frames = glob.glob("/path/to/pngs/*.png")
frames.sort()
for i in range(len(frames)):
if os.path.isfile(frames[i]) and i%2 == 1:
print frames[i]
wx.Yield()
##time.sleep(0.5)
wx.CallAfter(self.bitmap_1.SetBitmap,wx.Bitmap(frames[i], wx.BITMAP_TYPE_ANY))
wx.CallAfter(self.Update)
if __name__ == "__main__":
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
frame_1 = MyFrame(None, -1, "")
app.SetTopWindow(frame_1)
frame_1.Show()
app.MainLoop()
我wx.PostEvent
解決它見我的答案。
我想你的答案,但不明白。 – linuxrules94
更完整的示例會在處理線程中生成一些數據並將其顯示在主線程中。由於在你的例子中SetBitmap調用似乎是使用wx庫讀取圖像文件,所以沒有涉及任何單獨的「處理」。如果實際的程序做了一些處理來創建圖像(例如,從遠程服務器下載?),而不是從快速本地存儲讀取文件,那麼可以在單獨的線程中完成該處理。如果你只是在閱讀一堆文件,比如這個例子,問題是爲什麼要使用線程? – Dave