找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 1995|回复: 1

[求助] wxpython频繁使用MemryDC,引起段错误

1

主题

2

帖子

2

积分

贫民

积分
2
allan 发表于 2019-3-26 18:39:40 | 显示全部楼层 |阅读模式
最近学习使用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没事,这已经困扰我好几周了,有人能帮忙解答一下么
回复

使用道具 举报

1

主题

2

帖子

2

积分

贫民

积分
2
allan  楼主| 发表于 2019-3-26 18:47:42 | 显示全部楼层
#0  0x00007ffff58cd470 in gs_cairoGraphicsRenderer () at /usr/local/lib/python3.6/dist-packages/wx/libwx_gtk3u_core-3.0.so.0
#1  0x00007ffff5445a8e 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
#2  0x00007ffff53f2fd7 in wx**CImpl::SetGraphicsContext(wxGraphicsContext*) ()
    at /usr/local/lib/python3.6/dist-packages/wx/libwx_gtk3u_core-3.0.so.0
#3  0x00007ffff5e639bc in meth_wxMemoryDC_SelectObject(PyObject*, PyObject*, PyObject*) (sipSelf=<optimized out>, sipArgs=<optimized out>, sipKwds=<optimized out>) at ../../../../sip/cpp/sip_corewxMemoryDC.cpp:95
#4  0x00000000005030d5 in  ()
#5  0x0000000000506859 in _PyEval_EvalFrameDefault ()
#6  0x0000000000502209 in  ()
#7  0x0000000000502f3d in  ()
#8  0x0000000000506859 in _PyEval_EvalFrameDefault ()
#9  0x0000000000502209 in  ()
#10 0x0000000000502f3d in  ()
#11 0x0000000000506859 in _PyEval_EvalFrameDefault ()
#12 0x0000000000501945 in _PyFunction_FastCallDict ()
#13 0x0000000000591461 in  ()
#14 0x000000000059ebbe in PyObject_Call ()
#15 0x00000000005e1662 in  ()
#16 0x00007ffff77cc6db in start_thread (arg=0x7fffe1af6700) at pthread_create.c:463
#17 0x00007ffff7b0588f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表