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

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°59715
antsite
Je me souviens
Posté le 16-09-2001 à 11:09:51  profilanswer
 

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.

mood
Publicité
Posté le 16-09-2001 à 11:09:51  profilanswer
 

n°59718
la viper
Posté le 16-09-2001 à 11:48:47  profilanswer
 

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

n°59721
antsite
Je me souviens
Posté le 16-09-2001 à 12:20:38  profilanswer
 

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 ?

n°59724
la viper
Posté le 16-09-2001 à 12:45:42  profilanswer
 

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é

n°59763
antsite
Je me souviens
Posté le 16-09-2001 à 18:25:45  profilanswer
 

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 ?

n°59788
la viper
Posté le 16-09-2001 à 21:02:02  profilanswer
 

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

n°59817
BENB
100% Lux.
Posté le 17-09-2001 à 09:33:27  profilanswer
 

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]

n°59975
antsite
Je me souviens
Posté le 17-09-2001 à 21:12:21  profilanswer
 

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.

n°59989
la viper
Posté le 17-09-2001 à 23:10:23  profilanswer
 

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.

n°60278
antsite
Je me souviens
Posté le 19-09-2001 à 13:00:06  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

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

 

Sujets relatifs
comparaison de date sous visual c++VISUAL BASIC
reboot avec visual studio sous W2K!!![visual c++]est ce que quelqu'un sait comment appeler une fenetre
visual C++ ....question tres conProcessor pack pour Visual C++
[visual c++ 6] ou trouver de la doc sur le net en francaistéléchargement visual basic
comment on desassemble un petit programme (9 ko) en visual basic?[help] Erreur Compilation Visual C++ pour Appli Win32
Plus de sujets relatifs à : [Visual C++] Exemple de la fonciton WaitForSingleObject()


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