Précédent   Forum du club des développeurs et IT Pro > C et C++ > Bibliothèques > wxWidgets
wxWidgets Forums d'entraide pour la programmation wxWidgets en C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 18/02/2011, 19h35   #1
Fragnatik
Invité de passage
 
Inscription : avril 2004
Messages : 4
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 4
Points : 1
Points : 1
Par défaut Impossible de quitter proprement un wxThread via Exit()

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 :
Code :
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 :
Code :
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 :
Code :
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 :
Code :
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.
Fragnatik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 10h28   #2
Muetdhiver
Membre régulier
 
Inscription : septembre 2002
Messages : 195
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 195
Points : 82
Points : 82
Envoyer un message via MSN à Muetdhiver
Salut,

ton code m'a l'air très propre.

Deja, ce qui est sur, c'est qu'avec un "Delete" il faut obligatoirement un thread détaché....

Sinon, j'ai l'impression en fait que tu appelles, dans ton exemple, le Delete sur un thread qui n'a peut etre meme pas été créé...
A savoir, tu fais séquentiellement start puis stop, et le stop Appelle le Delete, mais si ca se trouve (???) dans le start, le run n'a meme pas été fait ?

As tu un ou plusieurs log du message "end iter" ?
Sinon essaie de mettre un sleep entre le start et stop, juste pour tester dans un premier temps.

Merci du retour.
Muetdhiver est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h17.


 
 
 
 
Partenaires

Hébergement Web