IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxWidgets Discussion :

Impossible de quitter un wxThread via Exit()


Sujet :

wxWidgets

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Impossible de quitter 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre averti Avatar de wxXav
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Décembre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur amateur

    Informations forums :
    Inscription : Décembre 2008
    Messages : 214
    Points : 354
    Points
    354
    Par défaut
    Salut.

    Si tu veux que le "Delete" présent dans la méthode "stop" soit effectif, il faut que tu appelles régulièrement, depuis la "boucle de travail", la méthode "TestDestroy".

    Et si cette méthode te retourne "true", tu dois au plus vite sortir de cette boucle de travail (en retournant un code spécifique te permettant de savoir pourquoi le thread s'est arrêté).

    @+
    Xav'

Discussions similaires

  1. Impossible de quitter proprement un wxThread via Exit()
    Par Fragnatik dans le forum wxWidgets
    Réponses: 1
    Dernier message: 07/12/2011, 10h28
  2. [VBA-W] Impossible de lancer une macro via AddIns.Add
    Par massif dans le forum VBA Word
    Réponses: 1
    Dernier message: 06/09/2006, 15h52
  3. Erreur 1045 impossible de se connecter à mysql via un script
    Par julian-brokendolls dans le forum Installation
    Réponses: 7
    Dernier message: 05/01/2006, 04h23
  4. Réponses: 7
    Dernier message: 20/03/2005, 14h53
  5. Impossible de quitter mon application!
    Par Bouillou dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/11/2002, 20h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo