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 :

wxThread : terminer un thread détaché


Sujet :

wxWidgets

  1. #1
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut wxThread : terminer un thread détaché
    Bonjour,
    J'ai un thread (wxTHREAD_DETACHED), et je souhaite l'arrêter. J'utilise pour cela la méthode wxThread:: Delete. Mais, au vue de la phrase pour moi un peu ambigüe:
    Citation Envoyé par Aide wxWidget
    (Note that while this could work on a joinable thread you simply should not call this routine on one as afterwards you may not be able to call wxThread::Wait to free the memory of that thread).
    Je me demande si c'est la bonne solution.

    Autre question, pour ce genre de thread (wxTHREAD_DETACHED), est-ce que j'ai un moyen de savoir s'il est terminé. En gros, comme j'ai un pointeur et comme le thread s'auto-détruit, je voudrais être assuré que mon pointeur est encore valide.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    J'ai un thread (wxTHREAD_DETACHED), et je souhaite l'arrêter. J'utilise pour cela la méthode wxThread:: Delete. Mais, au vue de la phrase pour moi un peu ambigüe:
    Je me demande si c'est la bonne solution.
    C'est la méthode a privilégier pour terminer un thread DETACHED depuis un autre thread. La phrase en question indique juste qu'il ne faut pas utiliser cette méthode pour arrêter l'autre type de thread, les threads JOINABLE.

    Autre question, pour ce genre de thread (wxTHREAD_DETACHED), est-ce que j'ai un moyen de savoir s'il est terminé. En gros, comme j'ai un pointeur et comme le thread s'auto-détruit, je voudrais être assuré que mon pointeur est encore valide.
    Non, une fois le thread terminé l'objet n'existe plus, il ne faut plus utiliser le pointeur. Pour savoir si le thread a bien été terminé il suffit de tester la valeur de retour de wxThread:elete().

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    Non, une fois le thread terminé l'objet n'existe plus, il ne faut plus utiliser le pointeur. Pour savoir si le thread a bien été terminé il suffit de tester la valeur de retour de wxThread:: Delete().
    En fait, c'était plutôt pour savoir si je devais mettre en place un système de synchronisation entre la fin du thread et les objets qui maintiennent une référence vers lui. Je sais qu'avec Windows, tu peux utiliser un handle qui reste valide même après la fin du thread. Cela te permet de savoir s'il est terminé ou non et évite les crashs de croisement. Donc, si j'avais une fonction IsValid(pThread)....
    Bon, ben merci pour les infos, YAKA faire cette synchro!

  4. #4
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Points : 145
    Points
    145
    Par défaut
    J'utilise pour cela la méthode wxThread:: Delete
    ta boucle principale du thread doit inclure la methode TestDestroy() il me semble.

    Exemple ou mon thread se detruit lui meme en cas de timeout.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while(life) {
    ....
    if(timeout) this->Delete();
     
    if(TestDestroy()) 	break;
     
    }
    est-ce que j'ai un moyen de savoir s'il est terminé
    Tres bonne question car j'ai le meme probleme: Mon interface n'arrive pas a savoir quand se thread à été détruit.

    J'aimerais savoir si on peut utiliser des events au lieu d'un handler proposer par 3DArchi.

  5. #5
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Je pense que le seul moyen pour savoir si un thread DETACHED est terminé est d'utiliser une wxCondition. J'ai eu à résoudre ce problème dans mon application (DVGrabGUI) ... et je me rappelle que ça peut être assez délicat!

    Voici un "code de principe":

    Dans la déclaration de la classe qui contient mon pointeur sur mon thread, j'ajoute une wxCondition (et un wxMutex pour la protéger!):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DvGrabThread *m_thread;  //!< The capture thread.
    wxMutex m_mutexEnd;      //!< The mutex locked during all the life of capture thread, protecting @a m_threadEnd.
    wxCondition m_threadEnd; //!< The condition signaling that the capture thread has actually halted.
    Ne pas oublier, lors de la construction de la condition, de lui passer son mutex de protection:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_threadEnd(m_mutexEnd)
    Pour créer/lancer le thread, j'acquière le mutex de protection de la condition, je crée mon thread (en oubliant pas de lui passer condition et mutex de protection! - je viens de me rendre compte en relisant mon code qu'il n'est pas forcément utile de passer le mutex de protection!?!), et je le lance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    m_mutexEnd.Unlock(); // To be sure to have this mutex unlocked!
    m_mutexEnd.Lock();
    m_thread = new DvGrabThread(&m_mutex, &m_mutexEnd, &m_threadEnd, &m_cth);
    if(m_thread)
    	m_thread->Run();
    Quand je veux arrêter mon thread, j'appelle sa méthode Delete(), puis j'attends que la condition soit signalée, avant de libérer son mutex de protection:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if(m_thread)
    {
    	m_thread->Delete();
    	m_threadEnd.Wait();
    	m_mutexEnd.Unlock();
    }
    m_thread = NULL;
    Enfin, cette fois dans le code du wxThread, juste avant de quitter, je signale la condition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_threadEnd->Signal();
    voilà, j'espère que c'est assez clair... et que je n'ai rien oublié De toutes façon, vous pouvez toujours voir un code qui marche avec mon programme (réservé à GNU/Linux, mais la partie concernant la gestion des threads est supposée universelle!

    Bastien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/05/2009, 11h15
  2. dans quel cas terminer un thread? thread.Abort()
    Par mnemonic78 dans le forum C#
    Réponses: 3
    Dernier message: 08/11/2008, 16h51
  3. Problème pour terminer un thread
    Par BestFF dans le forum Threads & Processus
    Réponses: 6
    Dernier message: 05/07/2008, 22h03
  4. [windows] une classe qui crée et termine un thread
    Par Biosox dans le forum Windows
    Réponses: 11
    Dernier message: 07/06/2007, 10h52
  5. [Threads] Comment terminer un thread ?
    Par Wookai dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 16/04/2005, 13h25

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