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 proprement 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 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 : 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 régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    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.

Discussions similaires

  1. Impossible de quitter un wxThread via Exit()
    Par Fragnatik dans le forum wxWidgets
    Réponses: 1
    Dernier message: 20/02/2011, 22h37
  2. Impossible d'accèder à mon pc via mon ip
    Par Alain15 dans le forum Réseau
    Réponses: 14
    Dernier message: 11/04/2006, 20h45
  3. capter le Ctrl-C pour quitter proprement
    Par progamer54 dans le forum Réseau
    Réponses: 2
    Dernier message: 08/04/2006, 17h41
  4. Impossible de contacter mon serveur FTP via ie
    Par Polskynet dans le forum Internet
    Réponses: 3
    Dernier message: 05/12/2005, 14h57
  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