|
最近学习使用wxpython开发视频界面控制程序,老是遇到段错误,每次都死在dc.SelectObject(bitmap),下面是我的简易版demo:
import wx
from wx import *
import time
import threading
class WorkerThread(threading.Thread):
def __init__(self, window, localchannel):
threading.Thread.__init__(self)
self.window = window
self.localchannel = localchannel
self.timeToQuit = threading.Event()
self.timeToQuit.clear()
self.dc = self.window.dc[localchannel]
def stop(self):
self.timeToQuit.set()
def run(self):
while (self.timeToQuit.is_set() == False):
time.sleep(0.01)
print(self.localchannel)
bitmap = wx.Bitmap(960, 720, -1)
self.dc.SelectObject(bitmap)
self.dc.SetBackground(wx.Brush("WHITE"))
self.dc.SetTextForeground("Purple")
self.dc.Clear()
self.dc.SelectObject(wx.NullBitmap)
del bitmap
class Trans(Frame):
def __init__(self, parent, id, title):
Frame.__init__(self, parent, id, title, size=(700, 500), style=DEFAULT_FRAME_STYLE | STAY_ON_TOP)
self.panel = wx.Panel(self)
self.SetBackgroundColour('Black')
self.imageBlack = wx.Image('black.jpg', wx.BITMAP_TYPE_JPEG).ConvertToBitmap()
self.bmp = wx.StaticBitmap(self, id=-1, bitmap=self.imageBlack, pos=(0, 0))
self.dc = []
self.threads = []
for i in range(4):
dc = wx.MemoryDC()
self.dc.append(dc)
thread = WorkerThread(self, i)
self.threads.append(thread)
thread.start()
self.Layout()
if __name__ == "__main__":
app = App()
# Trans(None, 1, "Transparent Window")
frame = Trans(None, 1, "Transparent Window")
frame.Show()
app.MainLoop()
想用4线程同时更新4条视频流,每一帧图片使用wx.MemoryDC进行一下处理,画一些线之类的,再用setBitmap更新到固定位置,在linux上可以稳定跑几十分钟,但是之后就crush,如下:
Thread 1 "python3.6" received signal SIGSEGV, Segmentation fault.0x00007ffff61a6a19 in wxGraphicsContext::SetFont(wxFont c**t&, wxColour c**t&) () from /usr/local/lib/python3.6/dist-packages/wx/libwx_gtk3u_core-3.0.so.0(gdb) bt#0 0x00007ffff61a6a19 in wxGraphicsContext::SetFont(wxFont c**t&, wxColour c**t&) () at /usr/local/lib/python3.6/dist-packages/wx/libwx_gtk3u_core-3.0.so.0#1 0x00007ffff6153fd7 in wx**CImpl::SetGraphicsContext(wxGraphicsContext*) () at /usr/local/lib/python3.6/dist-packages/wx/libwx_gtk3u_core-3.0.so.0#2 0x00007ffff6075cc8 in wxGTKCairoDC::wxGTKCairoDC(_cairo*) () at /usr/local/lib/python3.6/dist-packages/wx/libwx_gtk3u_core-3.0.so.0#3 0x00007ffff60a5d40 in wxWindow::GTKSendPaintEvents(_cairo*) () at /usr/local/lib/python3.6/dist-packages/wx/libwx_gtk3u_core-3.0.so.0#4 0x00007ffff60a608e in draw () at /usr/local/lib/python3.6/dist-packages/wx/libwx_gtk3u_core-3.0.so.0#5 0x00007ffff34627db in () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#6 0x00007ffff35a7fff in () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#7 0x00007ffff235c10d in g_closure_invoke () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0#8 0x00007ffff236f05e in () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0#9 0x00007ffff23770af in g_signal_emit_valist () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0#10 0x00007ffff237812f in g_signal_emit () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0#11 0x00007ffff35b4aba in () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#12 0x00007ffff339b3ba in gtk_container_propagate_draw () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#13 0x00007ffff339b4a2 in () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#14 0x00007ffff334ecf4 in () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#15 0x00007ffff33a03fd in () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#16 0x00007ffff33a5053 in () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#17 0x00007ffff3351601 in () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#18 0x00007ffff35b48bb in () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#19 0x00007ffff339b3ba in gtk_container_propagate_draw () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#20 0x00007ffff339b4a2 in () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#21 0x00007ffff35c26cf in () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0---Type <return> to continue, or q <return> to quit---#22 0x00007ffff35b48bb in () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#23 0x00007ffff35bd978 in () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#24 0x00007ffff3461839 in gtk_main_do_event () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#25 0x00007ffff2f72765 in () at /usr/lib/x86_64-linux-gnu/libgdk-3.so.0#26 0x00007ffff2f827f5 in () at /usr/lib/x86_64-linux-gnu/libgdk-3.so.0#27 0x00007ffff2f839f6 in () at /usr/lib/x86_64-linux-gnu/libgdk-3.so.0#28 0x00007ffff2f83bf0 in () at /usr/lib/x86_64-linux-gnu/libgdk-3.so.0#29 0x00007ffff235c10d in g_closure_invoke () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0#30 0x00007ffff236f05e in () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0#31 0x00007ffff2377715 in g_signal_emit_valist () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0#32 0x00007ffff237812f in g_signal_emit () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0#33 0x00007ffff2f7bac9 in () at /usr/lib/x86_64-linux-gnu/libgdk-3.so.0#34 0x00007ffff2f67080 in () at /usr/lib/x86_64-linux-gnu/libgdk-3.so.0#35 0x00007ffff2082c73 in () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0#36 0x00007ffff20821f5 in g_main_context_dispatch () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0#37 0x00007ffff20825c0 in () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0#38 0x00007ffff20828d2 in g_main_loop_run () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0#39 0x00007ffff3460a05 in gtk_main () at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0#40 0x00007ffff607dd85 in wxGUIEventLoop::DoRun() () at /usr/local/lib/python3.6/dist-packages/wx/libwx_gtk3u_core-3.0.so.0#41 0x00007ffff4831293 in wxEventLoopBase::Run() () at /usr/local/lib/python3.6/dist-packages/wx/libwx_baseu-3.0.so.0#42 0x00007ffff47f6f56 in wxAppC**oleBase::MainLoop() () at /usr/local/lib/python3.6/dist-packages/wx/libwx_baseu-3.0.so.0#43 0x00007ffff54b72ff in wxPyApp::MainLoop() (this=0xb50e70) at ../../../../sip/cpp/sip_corewxPyApp.cpp:316#44 0x00007ffff54b7517 in meth_wxPyApp_MainLoop(PyObject*, PyObject*) (sipSelf=<optimized out>, sipArgs=0x7fffe408e9b0) at ../../../../sip/cpp/sip_corewxPyApp.cpp:1837#45 0x0000000000502d6f in ()#46 0x0000000000506859 in _PyEval_EvalFrameDefault ()#47 0x0000000000502209 in ()#48 0x0000000000502f3d in ()#49 0x0000000000506859 in _PyEval_EvalFrameDefault ()#50 0x0000000000504c28 in ()#51 0x0000000000506393 in PyEval_EvalCode ()#52 0x0000000000634d52 in ()#53 0x0000000000634e0a in PyRun_FileExFlags ()#54 0x00000000006385c8 in PyRun_SimpleFileExFlags ()#55 0x000000000063915a in Py_Main ()#56 0x00000000004a6f10 in main ()
每次都死在dc.SelectObject(bitmap)处,所以弄了个简易版的demo,发现linux还是挂,windows没事,这已经困扰我好几周了,有人能帮忙解答一下么
|
|