[Visual C++] Exemple de la fonciton WaitForSingleObject()

Exemple de la fonciton WaitForSingleObject() [Visual C++] - Programmation

Marsh Posté le 16-09-2001 à 11:09:51    

Quelqu'un pourrait-il me donner un exemple de programme qui lance un thread et qui utilise la fonction WaitForSingleObject() pour attendre l'arrêter de ce thread pour quitter ? Merci.

Reply

Marsh Posté le 16-09-2001 à 11:09:51   

Reply

Marsh Posté le 16-09-2001 à 11:48:47    

moi j'ai un ex avec un process ..
 
void CShutDownDlg::Launch()
{
 int iValue = IDYES;
 CString str;
 str.LoadString(IDS_AVERTISSEMENT);
 
 if(m_End)
  iValue = AfxMessageBox(str, MB_YESNO, 0 );
 
 if (iValue == IDYES )
 {
  STARTUPINFO sui ;
  PROCESS_INFORMATION pi ;
  sui.cb = sizeof (STARTUPINFO);
  GetStartupInfo (&sui);
  sui.dwFlags = STARTF_USESHOWWINDOW ;
  if(m_Type)
   sui.wShowWindow = SW_MINIMIZE ;
  else
   sui.wShowWindow = SW_NORMAL ;
   
  DWORD dwCreationFlags = CREATE_NEW_CONSOLE;
 
  switch(m_Priority.GetCurSel())
  {
  case 0 : dwCreationFlags = dwCreationFlags | IDLE_PRIORITY_CLASS;break;
  case 1 : dwCreationFlags = dwCreationFlags | NORMAL_PRIORITY_CLASS;break;
  case 2 : dwCreationFlags = dwCreationFlags | HIGH_PRIORITY_CLASS;break;
  case 3 : dwCreationFlags = dwCreationFlags | REALTIME_PRIORITY_CLASS;break;
  default : dwCreationFlags = dwCreationFlags | NORMAL_PRIORITY_CLASS;break;
  }
 
  // Creation du process
  if(CreateProcess (GetPath(),
   GetParameter(),
   NULL,
   NULL,
   FALSE,
   dwCreationFlags,
   NULL,
   NULL,&sui,&pi) == 0)
   AfxMessageBox(IDS_ERRORPROCESS, MB_OK | MB_ICONSTOP);  
  else
  {
   PID = pi.dwProcessId;
   UpdateData(FALSE);
   ShowWindow(SW_HIDE);
 
   // Attente de la fin du process fils
   WaitForSingleObject(pi.hProcess, INFINITE);
   
   if(m_End) Exit();
   else OnQuit();
  }
 }
}

Reply

Marsh Posté le 16-09-2001 à 12:20:38    

Mon problème c que J'ai mis cette fonction dans void CMonAppDlg::OnClose() et j'ai l'impression que onClose() arrête le thread prématurement si bien qu'il ne retourne jamais et que la fonction WaitForSingleObject croie qu'il n'a pas fini et mon application se bloque quand je quitte. Comment faire ?

Reply

Marsh Posté le 16-09-2001 à 12:45:42    

teste ta fonction autre part que dans ton onclose tu seras fixé.. mais ca me semble bizarre parce que WaitForSingleObject connait le pid de la tache que tu lances .. donc il doit detecter quand celui ci est fermé

Reply

Marsh Posté le 16-09-2001 à 18:25:45    

j'ai fais comme tu me l'as conseillé, j'ai mis WaitForSingleObject() dans une autre fonction et ça marche toujours pas (ça bloque toujours), donc ça vient de mon code :
 
//Variables globales
HANDLE th;
DWORD x;
 
Quand je clique sur un bouton 'Start' :
{
th = CreateThread(NULL,0,srv,this,0,&x); //srv() est la fonction à lancer en thread
}
 
Quand je clique sur un bouton 'Stop' :
{
stop = 1; //arrête le thread (le while())
 
WaitForSingleObject(th,INFINITE); //il bloque ici, j'entends pas le beep :-)
MessageBeep(MB_OK);
}
 
//Le thread
DWORD WINAPI srv(void* pDialog)
{
 while(stop == 0)
 {
  //du code
 }
 return 0;
}
 
Tu vois le problème ?, pourquoi le thread est terminé et WaitForSingleObject croit qu'il est toujours en marche ?

Reply

Marsh Posté le 16-09-2001 à 21:02:02    

y'a une incoherence qq part.
admettons que tu arretes ton thread par stop=1 ... pkoi veux tu faire un WaitForSingleObject derriere ?? ca fait pas double emploi ?
admettons que le stop fonctionne, ca se pourrait bien que WaitForSingleObject soit dans les choux ..
et si tu veux que ton appli attende la fin de ton thread, WaitForSingleObject est mal positionné.. enfin je crois.
il faudrait le mettre juste en dessous de : th = CreateThread(NULL,0,srv,this,0,&x);  
 
mais bon .. j'ai pas testé là .. donc je peux dire des conneries
 
voilou..en tout cas, tiens moi au courant parce que ca m'interresse

Reply

Marsh Posté le 17-09-2001 à 09:33:27    

As-tu essaye de mettre ton code on mono thread ?
Es-tu sur que ton plantage vienne du multi-threading ?

 

[edtdd]--Message édité par BENB--[/edtdd]

Reply

Marsh Posté le 17-09-2001 à 21:12:21    

normalement, ça se voit pas dans l'exemple, mais juste après stop = 1, mon application quitte? Or le thread étant long à fermer, l'application quitte avant la fermeture complète du thread et bug. C pour ça que je voulais employer WaitFor...() pour attendre que le thread soit bien fermé proprement pour quitter.

Reply

Marsh Posté le 17-09-2001 à 23:10:23    

A noté comme ca, ca me vient à l'esprit. j'ai remarqué que sur un process l'utilisation du WaitForSingleObject, gelait l'appli jusqu'a ce que le process soit detruit.
Mais n'a n'influ en rien à ton programme.
essaye de killer le thread plutot que de le fermer, ca resoudra le probleme de ton appli mais pas celui de la fermeture correcte du thread. Enfin, c'est dommage mais ca m'interresse bcp, va falloir que je me penche sur la programmation multitache sous windows. J'ai bien des cours sous unix de multitache mais ca n'a pas le meme deployant au niveau du code.

Reply

Marsh Posté le 19-09-2001 à 13:00:06    

J'ai fais plusieurs tests :
 
voici mon thread :
while(stop == 0)
{
...
}
MessageBeep(MB_OK);
return 0;
 
Et bien à chaque fois que ça plante, j'entends pas le beep. Donc ça plante parce que le thread n'est pas fermé quand je quitte l'appli. Mon but c bien de le fermer avant de quitter. Stop = 1 amorce la fermeture mais l'application quitte avant que cette fermeture de thread soie achevée, et ça plante ! Je veux attendre un signal disant 'C bon le thread est fermé, tu peux quitter' et quitter.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed