Exemple de la fonciton WaitForSingleObject() [Visual C++] - Programmation
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();
}
}
}
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 ?
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é
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 ?
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
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]
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.
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.
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.
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.