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编程中诡异的段错误

转自:http://blog.csdn.net/icesorrow/article/details/1787491 编程中让人郁闷的事情莫过于段错误(也就是传说中的Core dumped),让人更郁...

linux下C编程free()时出现飘忽诡异的段错误(核心已转储)问题

先说一下问题现场。 代码如下 free(volthisframe->Tops); free(volthisframe->Bots); printf("what\n"); free(volth...

VS2015和QT5.5项目出现的诡异错误(LNK2001和LNK09)的解决办法

VS2015和QT5.5项目出现的诡异错误(LNK2001和LNK2109)的解决办法 今天要把一个旧的QT项目移植到VS2015和QT5.5.1的环境下,没想到出现了诡异的错误,发费了不少时间才找到...

C 语言专家编程(诡异之 C)

  • 2008-12-23 16:43
  • 7.48MB
  • 下载

Qt之网络编程错误总结

最近在做Qt网络编程,主要是项目需要,学习下Qt下网络编程的多线程实现。  1。 QTcpSocket 中的connectToHost() 是void类型的,所以调用这个函数后无论是否连上就发送数...

Qt编程常见编译错误及解析

转载自:http://blog.chinaunix.net/space.php?uid=21454189&do=blog&id=442244 0.预备知识:编译-运行一个c/c++程序时,编...

git遇到的诡异错误: Failed connect to github.com:443

我的linux系统突然不能访问github了,找了好久,试了各种方法,终于发现这篇文章中出现的情况和我一模一样! 特此转载记录下,感谢原博主。原文链接无法访问github 为什么会...

诡异的NoClassDefFoundError错误——也可能是65536引起的

一 场景 症状一 本来好好的App,在引入了某个第三方库之后,忽然就开始报错了: Caused by: java.lang.ClassNotFoundException: Did...

诡异的Qt eventFilter

在Qt Creator开发环境中,由于事件过滤不当,导致界面组件无法正常显示(QLineEdit不显示) bool QObject::eventFilter ( QObject * watched, ...

诡异的未定义错误--超前引用

最近被一个看似诡异的事情卡壳,情况大概是这样,很明显的文件的开始添加了某个类的头文件,但是在代码中使用所添加的类时候却提示未定义该类。其中原因最后终于发现,原来是非常经典的错误——超前引用。    ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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