Arréter des threads

cs_tdeco Messages postés 53 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 27 mai 2005 - 10 janv. 2005 à 02:55
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 10 janv. 2005 à 14:41
Dans le cadre d'un projet, j'ai une appliquation qui lance 2 threads qui fonctionnent en parallèle.
Le premier envoie cycliquement des messages au deuxième pour que celui-ci exécute des routines de fonctions. Le 2ème attend sur un GetMessage.
Puis à un certain moment, je veux tuer le 1er en appuyant sur un bouton.
l'appui sur le boutonprovoque la sortie de la boucle while de mon 1er thread, puis dans ce thread, ce que je veux faire c'est attendre que le 2ème soit en attente afin de lui lancer un message spécifique qui le tue

Voici le code:

UINT WINAPI CParamMachine :: ThreadTimer(LPVOID pParam){


long res= 0;
hMain = GetDlgItem(hDlg_IHM_MAIN, IDC_IMAGE);
while(pParamMachine->m_IsThreadTimerVivant == TRUE){
Sleep(700);
CMsgTRT * msgTRT;
msgTRT = new CMsgTRT();
PostThreadMessage(pParamMachine->m_pThreadTRT->m_nThreadID, 0, 0, (LPARAM)msgTRT);
msgTRT->~CMsgTRT();
}
Sleep(500); //MON PB

CMsgTRT * msgTRT;
msgTRT = new CMsgTRT();
msgTRT->IsQuitterThread = TRUE;
res = PostThreadMessage(m_pThreadTRT->m_nThreadID, 0, 0, (LPARAM)msgTRT);
delete msgTRT;
}
return 0;
}

UINT WINAPI CParamMachine ::ThreadTRT(LPVOID pParam){


MSG msg;
pParamMachine = (CParamMachine*)pParam;
while(GetMessage(&msg, NULL, 0, 0))
{

CMsgTRT * msgTRT1 = (CMsgTRT*)msg.lParam;


//Tuer le thread traitement
if(msgTRT1->IsQuitterThread == TRUE){
break;
}

////////////////FONCTIONS//////////////////////////////






}

return 0;
}

Kelk' peut il m'aider?

Merci d'avance

7 réponses

CriPpLe Messages postés 78 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 26 avril 2005
10 janv. 2005 à 08:02
Lien pour l'utilisation des threads en général.

et Comment arreter un thread de travail

Voilà, avec un ça tu devrais pouvoir te débrouiller ;)
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
10 janv. 2005 à 11:15
On ne passe jamais de pointeur locaux à PostMessage car le destinateire n'y aura pas forcément accès (l'objet sera peut-être détruit lors du traitement

msgTRT = new CMsgTRT();
PostThreadMessage(pParamMachine->m_pThreadTRT->m_nThreadID, 0, 0, (LPARAM)msgTRT);
msgTRT->~CMsgTRT();

=> utilise SendMessage ou alors une variable globale.
0
vdust Messages postés 43 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 14 mars 2007
10 janv. 2005 à 12:05
Bonjour,



Bon, je ne reviens pas sur le détails technique (mais important)
souligné par ymca2003. Si je comprend bien, tu envoies un message à la
deuxième thread pour qu'elle s'arrête, mais tu veux le faire seulement
lorsqu'elle est en attente ? Si tu n'as aucun "GetMessage" ailleurs dans ta boucle while
, tu n'as pas à attendre qu'elle soit en attente. En effet, le GetMessage va
chercher les messages dans une file d'attente, donc lorsque la première
thread envoie son message, le message est placé dans la file, et la
thread ira le récupéré au prochain GetMessage (s'il n'y a pas d'autres messages en attente avant). Tu n'as donc pas besoin de faire une pause avec la fonction Sleep.



Maintenant, pour terminer la deuxième thread, il suffit de quitter la boucle while
avec un break; et la procédure se termine en retournant 0 (enfin, probablement le savais-tu déjà :).


Enfin, si tu veux attendre que la deuxième thread soit terminée avant
de terminer la première, tu peux utiliser la boucle suivante dans la
1ère procédure juste après avoir posté ton message

(la variable hThread2 représente le handle de la deuxième thread) :




DWORD dw_exit_code;

do

{

GetExitCodeThread(hThread2, &dw_exit_code);

} while(dw_exit_code==STILL_ACTIVE);



ainsi, dès que la deuxième thread est terminée, la première se termine aussi.



ciao,


-- Virtual Dust --
0
cs_tdeco Messages postés 53 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 27 mai 2005
10 janv. 2005 à 12:38
Merci pour vos réponses


ymca2003, je ne vois pas bien ce que tu vx dire quand tu dis qu'il ne faut pas passer de pointeurs locaux à PostMessage. Peut etre qu'il ne faut pas détruire le message msgTRT
mais le détruire à la fin de mon thread.
0

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

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
10 janv. 2005 à 12:41
Oui c'est ça soit tu le détruit à la fin soit tu fait SendMessage
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
10 janv. 2005 à 14:34
ymca2003> es tu sur de :



msgTRT = new CMsgTRT();
PostThreadMessage(pParamMachine->m_pThreadTRT->m_nThreadID, 0, 0, (LPARAM)msgTRT);
msgTRT->~CMsgTRT();




la ok tu appelles le destructeur sur msgTRT, mais pour
autant la place mémoire qu'il occupait n'est pas désallouée. si
tu fais un delete msgTRT, ya appel du destructeur, puis appel de la
fonction qui libere l'espace mémoiré occupé par ce qui est pointé par
msgTRT.

tu confirmes?
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
10 janv. 2005 à 14:41
Exact la mémoire n'est pas désalouée dans son exemple (et elle ne le sera jamais car le pointeur est perdu juste après). De toute façon appeler de destructeur de cette façon n'est pas une très bonne idée. Une simple var locale au thread (pas à la boucle) devrait aller.

Une autre chose, je remarque que le thread est constitué d'une simple boucle avec un Sleep et un postmessage. dans ce cas utilise directement un timer qui postera WM_TIMER régulièrement à la fenêtrre principale et appellera la fonction de traitement. Ainsi aucun autre thread ne sera nécessaire à part le thread principal.
0
Rejoignez-nous