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

Threads & Processus C++ Discussion :

Contrôler la mort d'un thread


Sujet :

Threads & Processus C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 3
    Par défaut Contrôler la mort d'un thread
    Salut,

    Dans une application que je développe, j'ai besoin de créer un thread qui va exécuter en permanence une fonction d'Update. N'y connaissant pas grand chose en multithreading C++, je me suis servi de cet article : http://www.codeproject.com/KB/thread...gTutorial.aspx

    Je bosse sur du code qui est dans une DLL, et je n'ai pas accès à la fonction main() de mon appli. Je crée mon thread dans une fonction Initialize() d'une classe C++ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    unsigned	l_Id;
    DWORD		l_ExitCode;
     
    m_ThreadHandle = (HANDLE) _beginthreadex( NULL, 0, StaticUpdate, this, CREATE_SUSPENDED, &l_Id );
     
    ASSERT( m_ThreadHandle != 0 );
     
    GetExitCodeThread( m_ThreadHandle, &l_ExitCode );
     
    ResumeThread( m_ThreadHandle );
    Ici, m_ThreadHandle est une variable de classe de type HANDLE. Le thread se crée correctement et effectue bien l'appel à StaticUpdate(). Cependant, dès que la fonction Initialize() qui crée ce thread se termine, mon thread meurt. Je peux éviter ca en mettant un WaitForSingleObject( m_ThreadHandle, INFINITE ); à la fin de mon Initialize(), mais dans ce cas là je ne sors plus jamais de cette méthode, ce qui est gênant ^^.

    J'aimerais savoir comment je peux indiquer à mon thread qu'il ne doit pas mourir dès que la fonction qui l'a créé est terminée, et qu'il ne meure que lorsque je le demande explicitement. Est-ce possible ?

    Merci d'avance,

    Hurricanes.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est déjà le cas normalement (sauf si sa fonction principale retourne avant, bien sûr).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 3
    Par défaut
    Ben en gros, pour simplifier, ma classe est la suivante (j'ai enlevé tout ce qui servait à rien) :

    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
     
    class CCameraControl
    {
    	public:
     
    		CCameraControl();
    		~CCameraControl();
     
    		void Initialize();
    		void Update();
    		void Shut();
     
    	private:
     
    		static unsigned __stdcall StaticUpdate( void * _This )
    		{
    			CCameraControl * l_This = (CCameraControl*)_This;
     
    			l_This->Update();
     
    			return 1;
    		}
     
    		HANDLE	m_ThreadHandle;
    };
    Dans ma méthode Initialize(), je crée mon thread (le code est dans mon premier post). Dans la méthode Shut(), je vais killer mon thread, mais ca pour le moment on s'en fout un peu. La fonction Update(), c'est celle qui est appelée par le thread (il appelle en fait StaticUpdate() qui appelle Update(), j'ai lu qu'il fallait passer par une méthode statique comme ça pour permettre à un thread d'appeler une méthode de classe).

    Ce qui se passe, c'est que dès que la fonction Initialize() est terminée, le thread que j'ai créé à l'intérieur meurt, alors que je voudrais qu'il continue à tourner, jusqu'à ce que j'appelle Shut(), dans laquelle je le tue.

    Des idées ?

    Merci d'avance,

    Hurricanes.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    La fonction membre Update() contient-elle une boucle continue?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 3
    Par défaut
    Oui, pour mes tests j'ai mis un while(1) qui fait un printf(). Mais je viens cependant de résoudre le problème, ca venait pas de mon thread en fait, mais d'un traitement que je faisais à côté ...

    Désolé pour le dérangement inutile, le code ci-dessus fonctionne, en fait ^^

    Merci quand même. Je vais passer le titre du thread en [Résolu]

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 493
    Par défaut
    Ne jamais Killer un thread.
    Toujours lui demander de se terminer.
    Comment? Avec des events par exemple.
    http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx

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

Discussions similaires

  1. relancer un Thread une fois mort ?
    Par altahir007 dans le forum VB.NET
    Réponses: 4
    Dernier message: 01/01/2013, 17h06
  2. Comment démarrer mon Thread une fois mort ?
    Par alextomas dans le forum Concurrence et multi-thread
    Réponses: 13
    Dernier message: 08/07/2011, 21h33
  3. Comment attendre que tous les thread lancés soient morts pour lancer une action.
    Par rgesnot dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 31/03/2007, 20h27
  4. Contrôler le nombre de thread simultané
    Par player734 dans le forum POSIX
    Réponses: 3
    Dernier message: 30/10/2005, 22h56

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