使用opencv的qt app在关机时失败(0xC000004B)

时间:2011-09-14 23:54:54

标签: c++ qt dll opencv

在vs2008的调试下运行的简单qt(4.7.3)和opencv(2.3.1)应用终止于消息:

...
The thread 'Win32 Thread' (0x2418) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0x1cc4) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0xd7c) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0x2108) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0x17a0) has exited with code -1073741749 (0xc000004b).
The program '[472] QtArrSurf.exe: Native' has exited with code 0 (0x0).

0xC000004B错误代码表示STATUS_THREAD_IS_TERMINATING(试图暂停已经开始终止的线程)。

程序源代码:

#include <QtGui>
#include <opencv2/features2d/features2d.hpp>
int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    QPushButton b("button");
    b.show();
    QFileDialog::getOpenFileNames(&b, "Dialog", "", "Files(*.png)"); // problem trigger
    cv::SURF detectorSURF;    // just to touch opencv
    return a.exec();
}

如果评论对话框一切顺利,没有0xc000004b,程序中只有一个线程。 当执行对话框时,会生成许多线程,这些线程不会以对话框关闭:

0 > 6192    Main Thread Main Thread main    Normal  0
0   8928    Worker Thread   Win32 Thread    77a01f36    Normal  0
0   4620    Worker Thread   Win32 Thread    77a01f36    Normal  0
0   9800    Worker Thread   Win32 Thread    77a01f36    Normal  0
0   7924    Worker Thread   Win32 Thread    77a0014d    Normal  0
0   3844    Worker Thread   Win32 Thread    77a01f36    Normal  0
0   2524    RPC Thread  RPC Callback Thread 779ffd81    Normal  0
0   3068    Worker Thread   Win32 Thread    77a00552    Normal  0
...

这些主题是关于什么的? 他们有沉默的堆栈,如下:

  

NTDLL.DLL!77a01f36()
          [下面的框架可能不正确和/或缺失,没有为ntdll.dll加载符号]           ntdll.dll中!77a01f36()
          ntdll.dll中!77a2471e()
          KERNEL32.DLL!7587339a()
          ntdll.dll中!77a19ed2()
          ntdll.dll!77a19ea5()

感兴趣的地方是opencv dll中的CvModule静态对象。 的OpenCV \ 2.3.1 \模块\芯\ SRC \ system.cpp:

 CvModule cxcore_module( &cxcore_info );

在失败的情况下,我没有达到它的析构函数,但是很好(没有对话框)。

这种情况是否存在0xC000004B真正的问题?

有什么建议在哪里寻找解决方案?

感谢。

1 个答案:

答案 0 :(得分:0)

我相信你的应用并没有失败。

线程的退出代码可以是任何东西,来自线程的非零返回值不表示错误,它只是表示线程在退出时返回该值,无论出于何种原因。

除非您在退出时遇到崩溃或其他问题,否则我认为您可以安全地忽略该非零返回值。如果要完全理解线程返回此值的原因,则需要调试QT代码并确定执行此操作的线程。如果找到线程,可以在其出口点放置断点,以查看为什么此函数中的逻辑决定返回此值。