Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1495 connectés 

 


Dernière réponse
Sujet : [Visual C++] Exemple de la fonciton WaitForSingleObject()
antsite 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.

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
antsite 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.
la viper 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.
antsite 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.
BENB 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]

la viper 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
antsite 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 ?
la viper 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é
antsite 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 ?
la viper 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();
  }
 }
}
antsite 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.

Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR