2011-09-14 6 views
1

Simple qt (4.7.3) et opencv (2.3.1) de l'application en cours d'exécution sous débogage dans VS2008 se termine par messages:application qt avec opencv ne parvient pas à l'arrêt (0xC000004B)

... 
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 code d'erreur signifie STATUS_THREAD_IS_TERMINATING (Une tentative a été faite pour suspendre un thread qui a commencé à se terminer).

code source du programme:

#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(); 
} 

Si tout commentaire dialogue se déroule sans problème, sans 0xc000004b et il n'y a qu'un seul thread dans le programme. Lorsque le dialogue est exécuté un certain nombre de fils sont donné naissance, qui ne se ferme pas avec boîte de dialogue:

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

Ce que ces discussions sont sur le point? Ils ont des piles silencieuses, comme ceci:!

ntdll.dll 77a01f36()
[Cadres ci-dessous peuvent être incorrectes et/ou manquant, pas de symboles chargés pour ntdll.dll] ntdll.dll 77a01f36 ()
ntdll.dll! 77a2471e()
kernel32.dll! 7587339a()
ntdll.dll! 77a19ed2()
ntdll.dll! 77a19ea5()

Le lieu de L'intérêt est l'objet statique CvModule dans opencv dll. OpenCV \ 2.3.1 \ modules \ core \ src \ system.cpp:

CvModule cxcore_module(&cxcore_info); 

En échec cas, je n'atteint pas son destructor, mais en bon (sans dialogue) faire.

Cette situation est-elle réellement problématique avec 0xC000004B?

Une suggestion où chercher une solution?

Merci.

+0

Si vous utilisez des fichiers binaires OpenCV prédéfinis officiels provenant de sourceforge, vous verrez des threads TBB. –

Répondre

0

Je crois que votre application n'échoue pas.

Le code de sortie d'un thread peut être quelque chose, une valeur de retour non nulle d'un thread n'indique pas une erreur, il indique simplement que le thread a renvoyé cette valeur lorsqu'il est sorti, pour une raison quelconque.

Sauf si vous rencontrez un crash ou un autre problème à la sortie, je pense que vous pouvez ignorer cette valeur de retour non nulle. Si vous voulez comprendre entièrement pourquoi le thread renvoie cette valeur, vous devrez déboguer le code QT et déterminer quel thread est en train de le faire. Si vous trouvez le thread, vous pouvez mettre un point d'arrêt à son point de sortie, pour voir pourquoi la logique de cette fonction a décidé de renvoyer cette valeur.

Questions connexes