Bonsoir,
J'essaye de trouver une réponse à un comportement que je trouve étrange de la librairie wxWidgets, et rien à faire même après tout un tas de tests impossible de comprendre ce comportement. Je viens donc faire appel à vos connaissances.
Voici un bout de mon code simplifié :
La déclaration des classes :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class worker {
protected:
void process();
virtual void end_iter();
};
class threadedWorker : public worker, protected wxThread {
public:
threadedWorker() : wxThread(wxTHREAD_JOINABLE){};
//threadedWorker() : wxThread(wxTHREAD_DETACHED){};
void start();
void stop();
virtual void end_iter();
virtual ExitCode Entry();
}; |
Et l'implémentation :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| void worker::end_iter() {
wxLogMessage(_T("End of iter"));
}
void worker::process() {
for (int i=10; i!=0; --i) {
Sleep(250); //Simulate process
end_iter();
}
}
void threadedWorker::start() {
Create();
Run();
}
void threadedWorker::end_iter() {
wxLogMessage(_T("End of iter"));
if (TestDestroy())
Exit(0);
}
void threadedWorker::stop() {
wxThreadError res = Delete();
if (res != wxTHREAD_NO_ERROR) {
wxMessageBox(_T("Error terminating thread."));
wxMessageBox(wxString::Format(_T("Error: %d"), res));
}
}
wxThread::ExitCode threadedWorker::Entry() {
process();
} |
Pour tester le code je procède de la manière suivante :
1 2 3 4
|
threadedWorker test;
test.start();
test.stop(); |
Et quand je lance ce code Delete() me retourne l'erreur suivante "wxTHREAD_MISC_ERROR". Que ça soit avec un thread Detached ou Joinable.
Je suis un peu perdu j'ai l'impression que le problème vient de la fonction Exit(), sachant que le thread se termine sans problème dès l'appel de la fonction stop().
Sachant qu'en compilant en mode debug j'ai ce message d'erreur sur mon log :
Debug: In file ../../src/msw/thread.cpp at line 838: 'GetExitCodeThread' failed with error 0x00000006 (descripteur non valide).
Quelqu'un aurait une idée de ce que je fais mal ?
Merci d'avance pour vos réponses.
Partager