cs_tdeco
Messages postés53Date d'inscriptiondimanche 23 février 2003StatutMembreDernière intervention27 mai 2005
-
10 janv. 2005 à 02:55
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDerniè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
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 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.
vdust
Messages postés43Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention14 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.
cs_tdeco
Messages postés53Date d'inscriptiondimanche 23 février 2003StatutMembreDernière intervention27 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 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.
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 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.