Thread et appli

Résolu
fking Messages postés 4 Date d'inscription mardi 7 janvier 2003 Statut Membre Dernière intervention 4 février 2008 - 4 févr. 2008 à 18:46
fking Messages postés 4 Date d'inscription mardi 7 janvier 2003 Statut Membre Dernière intervention 4 février 2008 - 4 févr. 2008 à 20:30
Bonjour,

Je suis en train de faire une petite appli qui doit lancer une autre appli win32 et attendre la fin d'un calcul pour reprendre la main.
J'ai donc utilisé un CreateProcess(NULL,(LPTSTR) MonProg.exe,0,DETACHED_PROCESS,FALSE,0,0,0,&siStart,&piInfo)...

Puis j'attends la fin en faisant un GetExitCodeProcess(piInfo.hProcess, &dwExitCode) pour fermer l'application (voir code + loin).        

- Le hic c'est que après son calcul l'appli win32 me demande si je veux quitter avec un messagebox et attend la réponse... Le dwExitCode est toujours STILL_ATIVE du coup! c'est balot !:)

Bref comment détecter que l'appli affiche son fichu messagebox et attend la réponse pour pouvoir la tuer avec un :  TerminateProcess(piInfo.hProcess, 0);  par exemple...

Une dernière question subsidiaire... apparament le
siStart.wShowWindow = SW_HIDE ne fonctionne pas car je vois l'appli s'ouvrir et m'affiche sa boite de dialogue... Pourquoi mystère ?

Bref je bloque un peu ...

Voici mon bout de code :
STARTUPINFO siStart;
siStart.dwFlags = STARTF_USESTDHANDLES;
siStart.wShowWindow = SW_HIDE
siStart.cb =sizeof(siStart);
 
PROCESS_INFORMATION piInfo;
memset(&siStart,0,sizeof(siStart));
memset(&piInfo,0,sizeof(piInfo));
 DWORD dwExitCode;

 if(CreateProcess(NULL,(LPTSTR) MonProg.exe,0,DETACHED_PROCESS,FALSE,0,0,0,&siStart,&piInfo))/
 {
       GetExitCodeProcess(piInfo.hProcess, &dwExitCode); // Vérifie l'état du process avant la boucle
       while(dwExitCode == STILL_ACTIVE)
         {
         GetExitCodeProcess(piInfo.hProcess, &dwExitCode); // Regarde si le process est fini
         WxGauge1->SetValue(tempo++); // juste pour afficher l'avancement
         }
       CloseHandle(piInfo.hProcess); 
       CloseHandle(piInfo.hThread); 
}


Merci d'avance pour vos réponses,
-FKING-

3 réponses

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
4 févr. 2008 à 19:14
STARTUPINFO siStart;
siStart.dwFlags = STARTF_USESTDHANDLES;
siStart.wShowWindow = SW_HIDE
siStart.cb =sizeof(siStart);
 
PROCESS_INFORMATION piInfo;
memset(&siStart,0,sizeof(siStart)); // <- TU VIENS D'EFFACER TOUT CE QU'IL Y AVAIT DANS siStart
memset(&piInfo,0,sizeof(piInfo));

C++ (@++)<!--
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
4 févr. 2008 à 19:14
STARTUPINFO siStart;
siStart.dwFlags = STARTF_USESTDHANDLES;
siStart.wShowWindow = SW_HIDE
siStart.cb =sizeof(siStart);
 
PROCESS_INFORMATION piInfo;
memset(&siStart,0,sizeof(siStart)); // <- TU VIENS D'EFFACER TOUT CE QU'IL Y AVAIT DANS siStart
memset(&piInfo,0,sizeof(piInfo));

C++ (@++)<!--
0
fking Messages postés 4 Date d'inscription mardi 7 janvier 2003 Statut Membre Dernière intervention 4 février 2008
4 févr. 2008 à 20:30
 Oups quel nouille!! j'avais pas fait gaffe ... Comme j'ai pas mal bidouiller cette partie j'ai du faire un copier/coller de trop !
Bref comme quoi c'est bien d'avoir un regard extérieur !! Merci SaKingdom !! Je pige mieux pourquoi le SW_HIDE marche pas du coup !!! MDR.

Par contre pour le reste i.e intercepter l'apparition du messagebox indiquant la fin du programme de calcul pour tuer le processus je sais pas trop comment faire.

Vos suggestions sont donc les biens venues.
-FKING-
0
Rejoignez-nous