Простое приложение qt (4.7.3) и opencv (2.3.1), работающее в режиме отладки в vs2008, заканчивается сообщениями:
...
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 ()
Интересной достопримечательностью является статический объект CvModule в opencv dll.OpenCV \ 2.3.1 \ modules \ core \ src \ system.cpp:
CvModule cxcore_module( &cxcore_info );
В случае неудачи я не дохожу до деструктора, но в хорошем (без диалога) делаю.
Является ли эта ситуация с 0xC000004B реальной проблемой?
Любое предложение, где искать решение?
Спасибо.