Qt编程中诡异的段错误

原创 2007年09月16日 21:40:00
编程中让人郁闷的事情莫过于段错误(也就是传说中的Core dumped),让人更郁闷的情况是有时候段错误,有时候又不段错误。而基于第三方库开发的应用程序,当出现段错误时,更是难以调试,因为段错误的代码可能是在库代码中,这导致GDB工具也无法给出有用的调试信息。
要是真碰到这种情况,只能仰天长叹了!
前几天在把Opencv和Qt4结合起来,完成从摄像头捕捉视频,并显示出来的问题时,就遇到了这种段错误。出现段错误时给出的出错信息如下:
ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 8086cc8. Receiver '' (of type 'QSocketNotifier') was created in thread 8052280", file kernel/qcoreapplication.cpp, line 253
忽略 (core dumped)
以前只用Opencv完成这部分功能的时候,用到了Boost线程库实现的多线程,让视频显示部分的代码在一个新线程中执行,主线程就不会被阻塞。现在用Opencv结合Qt4来实现这部分功能,多线程部分就使用了QThread。(重载QThread的run())

void MyThread::run()...{
    QImage image;
    signal 
= VIDEO_PAUSE;
    
while((pImage = cvQueryFrame(pCapture)) != NULL)...{
        
if(signal == VIDEO_START)...{
            cvWriteFrame(videowriter, pImage);
            emit RenderImage(IplImageToQImage(pImage));
        }

        
else if(signal == VIDEO_STOP)
            
break;
        cvWaitKey(
2);
    }

}

原本的程序是在循环里面用update()发出一个paintEvent()事件来刷新图像的,后来看了错误信息,知道了事件是不能在两个线程之间发送的,于是通过发送信号signal/slot的方式来实现目的,即上述线程向主线程发送一个signal(带QImage),主线程接收这个信号并在本线程内update()一个paintEvent()事件,这样一来,就不会在两个线程之间发送事件了。
本以为问题就此解决,可以洗个脚回去睡觉了!结果还是段错误,而且错误信息也还是一样。于是其后有一段时间都在自我否定中,让我对开始的一系列推理和做法将信将疑。
在其后长达n个小时的时间里,我试着去掉一些代码,来看看是否会有段错误的发生,结果依然还是段错误。终于后来感动上天....
那一夜,俱乐部,包宿....就在11点多钟的时候:
我把cvWaitKey(2)去掉,然后编译,运行程序,运行了一分多钟没有出现段错误,但我还不能确信,因为有时候就是跑了一分多钟才段错误的,于是我一直等着...结果终于没有再段错误了。
原因分析:在Opencv窗口显示中需要包含cvWaitKey(?)否则窗口无法显示出来,因此我一直认为在Qt中显示,它也应该需要。不想竟是它出了问题,cvWaitKey(?)调用了系统定时器,因此可能会向该进程的所有线程发送一个事件,于是便导致了在两个线程之间发送事件的错误。

QT程序运行崩溃解决方法

FTH: (8092): *** Fault tolerant heap shim applied to current process. This is usually due to previou...
  • chenchen224
  • chenchen224
  • 2017年08月14日 16:19
  • 604

令人迷茫的QT程序错误

关于QT的qDebug错误,相当扯蛋的说
  • uestcshe
  • uestcshe
  • 2010年08月28日 22:37
  • 548

Qt问题汇总

Qt程序,总会遇到各种使人凌乱的问题,于是决定开始记录... 一、程序移植问题      1、用vs2010交叉编译的Qt4.7.4程序,在移植到x86的裸机上时,需要添加..\Microsoft V...
  • zddmail
  • zddmail
  • 2012年12月06日 11:37
  • 4279

(Qtcpsocket)退出程序时提示段错误的解决

这几天使用QT附带的一个example程序fortuneclient,开发了一个tcp通信的小程序,偶然间发现原来的程序存在一个小bug,当填入的ip地址或者端口号错误,关闭程序时,会报段错误,并弹出...
  • vah101
  • vah101
  • 2010年11月01日 17:49
  • 6459

QTcpSocket断开自动重新连接 auto connect after disconnected

class Socket { public: Socket(); ~Socket(); public slots: void OnConnected(); void OnDisc...
  • owldestiny
  • owldestiny
  • 2012年12月30日 13:47
  • 6055

QTcpSocket使用过程中的一些问题记录

目前,在将原来C的socket通讯改为使用Qt类库QTcpSocket通讯,在修改过程
  • ylluo_hust
  • ylluo_hust
  • 2014年04月21日 20:36
  • 3773

Qt QTcpSocket 对连接服务器中断的不同情况进行判定

简述 对于一个C/S结构的程序,客户端有些时候需要实时得知与服务器的连接状态。而对于客户端与服务器断开连接的因素很多,现在就目前遇到的情况进行一下总结。 分为下面六种不同情况 客...
  • wojiuguowei
  • wojiuguowei
  • 2017年08月23日 19:17
  • 397

关于使用QTcpSocket的一些总结

QTcpSocket类的方法connectToHost会泄露内存,即使把调用这个方法的QTcpSocket实例delete掉,内存也不会释放!反复connectToHost会导致段错误,十分危险。必须...
  • qq473179304
  • qq473179304
  • 2017年04月29日 15:33
  • 3204

QTcpSocket使用过程中的一些问题记录

目前,在将原来C的socket通讯改为使用Qt类库QTcpSocket通讯,在修改过程中遇到不少问题,在此将问题一并记录,以备后面使用。         采用的通讯方式:QTimer定时器、...
  • u011430225
  • u011430225
  • 2016年10月27日 15:42
  • 3032

QTcpSocket通信编程时阻塞与非阻塞的问题

目标,qt程序作为客户端,windows下winsock作为服务器端,实现两端通信。 开始时写了一个小函数测试: [cpp] view plain copy QTcpSocket tmpSoc...
  • itjobtxq
  • itjobtxq
  • 2012年11月20日 14:52
  • 1877
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt编程中诡异的段错误
举报原因:
原因补充:

(最多只允许输入30个字)