Connaitre l'état d'un thread pour quitter l'appli

Signaler
Messages postés
130
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
8 juillet 2008
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Salut a tous!
Voila, j'ai un programme dans lekel j'ai lancé plusieurs thread, dont un principal (du point de vue fonctionnalité).
Qd ce dernier s'arrete, les autres doivent s'arreter.
Mon souci, c'est que je n'arrive pas a trouver comment savoir s'il s'est arreter ou pas


AfxBeginThread(MyThreadProc1, l_poElement1);
AfxBeginThread(MyThreadProc2, l_poElement2);

while(1)

{
Sleep(100);
}

Comment je peux donc sortir de mon while, au moment ou le premier thread est terminé ??

J'ai essayer GetExitCodeThread, mais je n'ai pas reussi a le faire marcher comme il faut apriori.

Merci pour votre aide.

16 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Une boucle sans fin est la pire des solutions, à enlever.
Utiliser WaitForSingleObject ou WaitForMultipleObjects selon le cas.

ciao...
BruNews, MVP VC++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Ou bien tout simplement une variable booléenne globale, qui reste a mon avis une meilleure solution pour des cas simples.
Messages postés
130
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
8 juillet 2008
1
Vous auriez un exemple concret a me donner? Par exemple, comment je peux utiliser le WaitForSingleObject ?
Oui si je passe par une variable globale, c que je garde mon while?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Dans les deux cas on garde un while
Messages postés
130
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
8 juillet 2008
1
Par rapport a ce que j'ai marqué, vous tu pourrais me modifier le code comme il faut? Car franchement, je vois pas. Je pense que le WaitForSingleObject serait bien, mais je vois pas comment l'utiliser.....
Messages postés
75
Date d'inscription
dimanche 10 octobre 2004
Statut
Membre
Dernière intervention
30 novembre 2005

Salut,

Pour utiliser WaitForSingleObject tu peux faire ceci :

Tu dois mettre en premier paramètre le handle de ton thread et en second le temps d'attente.
Par exemple :
DWORD hThreadStatus; // Qui va savoir si ton thread est toujours actif
hThreadStatus = WaitForSingleObject(hMon_HANDLE, 100);

if (hThreadStatus == WAIT_TIMEOUT)

{
// Le Thread na pas fini son travail.
}

Voilà

BIG_BOSS
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
vecchio > pas de while sur attente de fin de thread, justement ce qui est à enlever.

sans MFC:
hthrd = CreateThread(...);
WaitForSingleObject (hthrd, INFINITE);
le reste sera exécuté quand hthrd sera fini.

ciao...
BruNews, MVP VC++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Oui, j'avais en tête une utilisation non bloquante, mais la c'est vrai que WaitForSingleObject est la meilleure solution, toutes mes excuses
Messages postés
75
Date d'inscription
dimanche 10 octobre 2004
Statut
Membre
Dernière intervention
30 novembre 2005

[Citation de BruNews]
hthrd = CreateThread(...);
WaitForSingleObject (hthrd, INFINITE);
le reste sera exécuté quand hthrd sera fini.
de BruNews

BruNews tu pourrai m'expliquer stp comment on fait pour exécuté le code sous la ligne WaitForSingleObject avec pour segond paramètre INFINITE si par exemple le Thread est bloqué sur quelques choses ? (c'est peut-être bête comme question mais je débute en WIN32)

BIG_BOSS
Messages postés
130
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
8 juillet 2008
1
re!
J'ai essayer avec le createthread, mais en fait, ca ne semble pas marche,r disons que le waitforsingleobject n'est pas bloquant.
Voici ce que j'ai:


DWORD WINAPI MyThreadProcDecision2( LPVOID pParam )
{
while(1) //a titre de boucle, car traitement en cours, juste pr l'exemple

...
}

main()
{
HANDLE hThread;
hThread = CreateThread(NULL, 0, MyThreadProcDecision2, NULL, 0, NULL);
...
WaitForSingleObject (hThread, INFINITE);
...

}
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Je parie que CreateThread échoue (Dernier param). Pas sur, mais vérifie au moins que que hThread est valide quand tu appelles WaitForSingleObject
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
BIG_BOSS_001> Si le thread est bloqué, je crois que c'est so problème, pas au programme principal de gérer ca, sauf si l'utilisation de WaitForSingleObject est fait dans ce but
Messages postés
130
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
8 juillet 2008
1
Du coup, je vois pas ce que je dois mettre....Pourrais-tu corriger mes lignes stp?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
HANDLE hThread;
DWORD dwThreadID;
hThread = CreateThread(NULL, 0, MyThreadProcDecision2, NULL, 0, &dwThreadID);
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Tu es sous 9x peut être? le premier code marche chez moi
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
pour les winbébé faut mettre une adresse DWORD au dernier param (thrdID) sinon badaboum.

Vous êtes assez nombreux, je passe mon chemin.

ciao...
BruNews, MVP VC++