BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
4 juin 2006 à 23:28
gbourgeois0019
Messages postés152Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention 2 juin 2008
-
6 juin 2006 à 07:20
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
gbourgeois0019
Messages postés152Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention 2 juin 20081 6 juin 2006 à 07:20
Ok Merci ! ;)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 6 juin 2006 à 03:26
int bstop = 0;
Les threads regardent régulièrement bstop et si le prog le met à 1 les threads sortent, très simple.
gbourgeois0019
Messages postés152Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention 2 juin 20081 6 juin 2006 à 00:03
C'est fait ;)
wxccxw
Messages postés755Date d'inscriptionsamedi 15 mai 2004StatutMembreDernière intervention30 janvier 2011 5 juin 2006 à 22:48
ton application n'est elle pas en DEBUG, plz compile en RELEASE !
gbourgeois0019
Messages postés152Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention 2 juin 20081 5 juin 2006 à 18:07
donc si j'ajoute dans la boucle de chacuns des threads le code suivant :
PeekMessage(&Msg,NULL,0,0,PM_REMOVE);
if ( Msg.message == EXIT )
{
return;
}
Et que je remplace chaque TerminateThread par ceci :
PostThreadMessage(m_IdThread,EXIT,0,0);
//EXIT etant un #define EXIT WM_USER+1
Est-ce que je règle le problème ??
gbourgeois0019
Messages postés152Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention 2 juin 20081 5 juin 2006 à 17:08
Merci BruNews pour ton explication. Je vais essayer de ne pas l'oublier !
MuPuF
Messages postés536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 août 2008 5 juin 2006 à 14:52
ok merci, je vais changer tout mes exit thread en return alors, par chance j'en ais peu.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 5 juin 2006 à 14:47
C'est "un peu plus propre" car la pile du thread est désallouée mais aucun objet C++ ne passera par son destructeur (idem en cela à TerminateThread).
Un code C++ dont les threads manipulent des classes doit utiliser _beginthreadex() (ou fonctions MFC si est le cas) et s'arranger pour faire sortir chaque thread par son 'return value'.
MuPuF
Messages postés536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 août 2008 5 juin 2006 à 14:26
salut brunews, ce probleme avec terminateThread se pose t'il aussi avec la fonction ExitThread ?
Merci d'avoir précisé pour le TerminateThread.
Extreme urgence, c'est un blocage de la thread par exemple ? (je m'en sert contre ça justement, un timer et si ça fais plus de 5 secondes que la thread devrait etre fermé alors hop terminatethread).
merci encore de la précision, j'avais pas pensé aux strings qui ne se désaloueraient pas.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 5 juin 2006 à 10:42
Derrière TerminateThread, plus aucun temps processeur ne sera alloué au thread car considéré comme plus existant. CString (et/ou autre classe) ne passera jamais par son destructeur et ne libèrera jamais la mémoire allouée.
TerminateThread est une fonction d'extrème urgence, il faut prévoir un mécanisme de sortie 'propre' pour le thread, return valeur.
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 5 juin 2006 à 09:02
gbourgeois0019
Messages postés152Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention 2 juin 20081 5 juin 2006 à 01:44
Encore pire est l'emploi de TerminateThread, CString et autres bidules, absolument rien n'est libéré. Imagine si ton prog devait continuer après la fermeture des threads...
J'ai pas trop saisi .. est-ce que tu pourrais m'Expliquer un peu plus svp ? Je sais que je fais des erreurs et c'est normal je crois car je ne programme pas depuis longtemps. L'important c'est que je cherche à m'améliorer !
Merci
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 4 juin 2006 à 23:28
Exemple à ne jamais suivre.
Si on fait du MFC alors on utilise les fonction thread de MFC, ce qui peut passer ici mènerait au crash dans un projet plus important. Richter explique le danger de non appel correct des constructeurs lors d'appel direct de CreateThread avec des classes C++, s'y reporter.
Encore pire est l'emploi de TerminateThread, CString et autres bidules, absolument rien n'est libéré. Imagine si ton prog devait continuer après la fermeture des threads...
6 juin 2006 à 07:20
6 juin 2006 à 03:26
Les threads regardent régulièrement bstop et si le prog le met à 1 les threads sortent, très simple.
6 juin 2006 à 00:03
5 juin 2006 à 22:48
5 juin 2006 à 18:07
PeekMessage(&Msg,NULL,0,0,PM_REMOVE);
if ( Msg.message == EXIT )
{
return;
}
Et que je remplace chaque TerminateThread par ceci :
PostThreadMessage(m_IdThread,EXIT,0,0);
//EXIT etant un #define EXIT WM_USER+1
Est-ce que je règle le problème ??
5 juin 2006 à 17:08
5 juin 2006 à 14:52
5 juin 2006 à 14:47
Un code C++ dont les threads manipulent des classes doit utiliser _beginthreadex() (ou fonctions MFC si est le cas) et s'arranger pour faire sortir chaque thread par son 'return value'.
5 juin 2006 à 14:26
Merci d'avoir précisé pour le TerminateThread.
Extreme urgence, c'est un blocage de la thread par exemple ? (je m'en sert contre ça justement, un timer et si ça fais plus de 5 secondes que la thread devrait etre fermé alors hop terminatethread).
merci encore de la précision, j'avais pas pensé aux strings qui ne se désaloueraient pas.
5 juin 2006 à 10:42
TerminateThread est une fonction d'extrème urgence, il faut prévoir un mécanisme de sortie 'propre' pour le thread, return valeur.
5 juin 2006 à 09:02
http://www.cppfrance.com/codes/DISTANCE-PARCOURRUE-SOURIS-WIN32-HOOK_18005.aspx
5 juin 2006 à 01:44
J'ai pas trop saisi .. est-ce que tu pourrais m'Expliquer un peu plus svp ? Je sais que je fais des erreurs et c'est normal je crois car je ne programme pas depuis longtemps. L'important c'est que je cherche à m'améliorer !
Merci
4 juin 2006 à 23:28
Si on fait du MFC alors on utilise les fonction thread de MFC, ce qui peut passer ici mènerait au crash dans un projet plus important. Richter explique le danger de non appel correct des constructeurs lors d'appel direct de CreateThread avec des classes C++, s'y reporter.
Encore pire est l'emploi de TerminateThread, CString et autres bidules, absolument rien n'est libéré. Imagine si ton prog devait continuer après la fermeture des threads...