Сбой приложения qt с opencv при завершении работы (0xC000004B) - PullRequest
1 голос
/ 15 сентября 2011

Простое приложение 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 реальной проблемой?

Любое предложение, где искать решение?

Спасибо.

1 Ответ

0 голосов
/ 15 сентября 2011

Я считаю, что ваше приложение не выходит из строя.

Код выхода потока может быть любым, ненулевое возвращаемое значение потока не указывает на ошибку, оно просто указывает, что поток возвратил это значение при выходе по любой причине.

Если вы не столкнулись с сбоем или какой-либо другой проблемой при выходе, я думаю, вы можете спокойно игнорировать это ненулевое возвращаемое значение.Если вы хотите полностью понять, почему поток возвращает это значение, вам нужно будет отладить код QT и определить, какой поток это делает.Если вы нашли поток, вы могли бы поставить точку останова в точке его выхода, чтобы понять, почему логика в этой функции решила вернуть это значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...