Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Invité de passage
    Inscrit en
    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.

  2. #2
    Membre régulier
    Inscrit en
    septembre 2002
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : septembre 2002
    Messages : 197
    Points : 89
    Points
    89

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •