begin process at 2010 02 10 06:40:38
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Arréter des threads


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Arréter des threads

lundi 10 janvier 2005 à 02:55:08 | Arréter des threads

tdeco

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

lundi 10 janvier 2005 à 08:02:42 | Re : Arréter des threads

CriPpLe

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 ;)

lundi 10 janvier 2005 à 11:15:40 | Re : Arréter des threads

ymca2003

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.
lundi 10 janvier 2005 à 12:05:41 | Re : Arréter des threads

vdust

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 --

lundi 10 janvier 2005 à 12:38:15 | Re : Arréter des threads

tdeco

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.

lundi 10 janvier 2005 à 12:41:50 | Re : Arréter des threads

ymca2003

Oui c'est ça soit tu le détruit à la fin soit tu fait SendMessage
lundi 10 janvier 2005 à 14:34:36 | Re : Arréter des threads

cosmobob

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?
lundi 10 janvier 2005 à 14:41:27 | Re : Arréter des threads

ymca2003

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.

 



Cette discussion est classée dans : while, msg, threads, msgtrt, cmsgtrt


Répondre à ce message

Sujets en rapport avec ce message

boucle de message interrompue [ par juliol ] bonjour, je fais un prog qui utilise un hookpour qu'il tourne en permanence, apres l'avoir cree, je lance une boucle infinie et je met ma boucle de me Rexherche exemple de programme avec Threads [ par jujunio ] Bonjour, je souhaiterai utilser les threads dans un programme pour lancer plusieurs appli. Mais je ne comprend rien aux Threads.Pourriez-vous m'aider problème avec AfxBeginThread(...) [ par jujunio ] Bonjour,J'essaye de lancer des threads dans un programme MFC. Mais je ne comprend rien aux threads. Voci mon prog, est-ce qu'il manque quelquechose ?? ptite kestion sur ExitThread [ par none77 ] bonjour,j'ai un thread qui boucle sans cesse avec une variable booléenne et un while.Donc quand je souhaite arreter mon thread je change d'état le boo Pb avec fonctin readFile qd j'utilise des Threads [ par jujunio ] Bonjour à tous !J'tilise la fonction ReadFile pour lire sur le port COm du PC.La lecture fonctionne correctement sans les Threads.J'ai décidé de mettr Encore Pb avec ReadFile en utilisant les Threads [ par jujunio ] Bonjour à tous !J'tilise la fonction ReadFile pour lire sur port COM.Ca fonctionne correctement sans les Threads.Avec les Threads ça ne veut plus marc HOW TO:PID & com prog & up et DL [ par youpiyoyo ] Ce post pourrait aussi bien etre dans la rubrique réseaux que system.mais bonvoici mes questions j'aurai tout d'abord besoin d'un truc:comment faire p bibliotheque c++ standard pour les threads windows ? [ par wulfran ] Afin de découvrir la programmation sous Windows (je programme habituellement sous Unix) je me suis lancé dans le developpement d'un petit programme ut synchro par événement [ par pedu ] Bonjour, qui peut m'expliquer avec un exemple simple (petite source en c++ avec 3 ou 4 threads exécutant une fonction simple) la subtilité entre Pulse Kel librairie pour utiliser les threads? [ par milhandril ] J'essai d'utiliser des threads dans mon prog, mais je n'arrive pas à trouver la librairie à utiliser pour qu'il que VC++ 6 reconnaisse le type CThread


Nos sponsors


Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales