在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
...

这些线程是关于什么的?
它们具有无声堆栈,如下所示:



感兴趣的地方是opencv dll中的CvModule静态对象。
OpenCV \ 2.3.1 \ modules \ core \ src \ system.cpp:
 CvModule cxcore_module( &cxcore_info );

在失败的情况下,我没有到达其析构函数,但在没有对话的情况下却可以。

0xC000004B的这种情况真的有问题吗?

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

谢谢。

最佳答案

我相信您的应用程序不会失败。

线程的退出代码可以是任何东西,线程返回的值非零并不表示错误,它仅表示线程出于任何原因退出时都返回了该值。

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

关于c++ - 带有opencv的qt应用在关闭时失败(0xC000004B),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7424348/

10-12 20:50