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

themaste Messages postés 130 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 8 juillet 2008 - 29 juil. 2005 à 15:12
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 29 juil. 2005 à 17:23
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

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

ciao...
BruNews, MVP VC++
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
29 juil. 2005 à 15:53
Ou bien tout simplement une variable booléenne globale, qui reste a mon avis une meilleure solution pour des cas simples.
0
themaste Messages postés 130 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 8 juillet 2008 2
29 juil. 2005 à 15:56
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?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
29 juil. 2005 à 15:58
Dans les deux cas on garde un while
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
themaste Messages postés 130 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 8 juillet 2008 2
29 juil. 2005 à 16:08
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.....
0
BIG_BOSS_001 Messages postés 75 Date d'inscription dimanche 10 octobre 2004 Statut Membre Dernière intervention 30 novembre 2005
29 juil. 2005 à 16:12
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
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
29 juil. 2005 à 16:13
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++
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
29 juil. 2005 à 16:36
Oui, j'avais en tête une utilisation non bloquante, mais la c'est vrai que WaitForSingleObject est la meilleure solution, toutes mes excuses
0
BIG_BOSS_001 Messages postés 75 Date d'inscription dimanche 10 octobre 2004 Statut Membre Dernière intervention 30 novembre 2005
29 juil. 2005 à 16:51
[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
0
themaste Messages postés 130 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 8 juillet 2008 2
29 juil. 2005 à 16:52
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);
...

}
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
29 juil. 2005 à 17:05
Je parie que CreateThread échoue (Dernier param). Pas sur, mais vérifie au moins que que hThread est valide quand tu appelles WaitForSingleObject
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
29 juil. 2005 à 17:06
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
0
themaste Messages postés 130 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 8 juillet 2008 2
29 juil. 2005 à 17:07
Du coup, je vois pas ce que je dois mettre....Pourrais-tu corriger mes lignes stp?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
29 juil. 2005 à 17:10
HANDLE hThread;
DWORD dwThreadID;
hThread = CreateThread(NULL, 0, MyThreadProcDecision2, NULL, 0, &dwThreadID);
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
29 juil. 2005 à 17:11
Tu es sous 9x peut être? le premier code marche chez moi
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
29 juil. 2005 à 17:23
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++
0