Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ouvrir une application et attendre qu'elle soir chargée

7 réponses
Avatar
Ubicell
Bonjour à tous,
Voila je voudrais savoir quelles fonctions utiliser en c++
pour ouvrir une application et attendre qu'elle soit chargée.
J'utilisait ShellExecute mais il rend immediatement la main à mon
application sans attendre que le programme s'ouvre .
Je programme sous XP
D'avance merci .

7 réponses

Avatar
Christian ASTOR
Ubicell wrote:

Voila je voudrais savoir quelles fonctions utiliser en c++
pour ouvrir une application et attendre qu'elle soit chargée.



ShellExecuteEx() ou CreateProcess() + WaitForInputIdle()
Avatar
adebaene
Ubicell wrote:
Bonjour à tous,
Voila je voudrais savoir quelles fonctions utiliser en c++
pour ouvrir une application et attendre qu'elle soit chargée.
J'utilisait ShellExecute mais il rend immediatement la main à mon
application sans attendre que le programme s'ouvre .
Je programme sous XP
D'avance merci .



Commences par te donner une définition précise de "être chargée" :
tu verras vite qu'il n'y a pas de réponse absolue : cela dépend du
type d'application (par exemple, quand est-ce que SQL Server "est
chargé" lorsqu'on le lance ???).

La réponse de Christian convient pour les applications GUI.

Arnaud
MVP - VC
Avatar
adebaene
Ubicell wrote:
Bonjour à tous,
Voila je voudrais savoir quelles fonctions utiliser en c++
pour ouvrir une application et attendre qu'elle soit chargée.
J'utilisait ShellExecute mais il rend immediatement la main à mon
application sans attendre que le programme s'ouvre .
Je programme sous XP
D'avance merci .



Commences par te donner une définition précise de "être chargée" :
tu verras vite qu'il n'y a pas de réponse absolue : cela dépend du
type d'application (par exemple, quand est-ce que SQL Server "est
chargé" lorsqu'on le lance ???).

La réponse de Christian convient pour les applications GUI.

Arnaud
MVP - VC
Avatar
Cyrille Szymanski
Bonjour,

On 2005-02-23, Christian ASTOR a écrit:
Voila je voudrais savoir quelles fonctions utiliser en c++
pour ouvrir une application et attendre qu'elle soit chargée.



ShellExecuteEx() ou CreateProcess() + WaitForInputIdle()



J'aimerais savoir si on est obligés de créer un deuxième thread
qui bloque sur WaitForInputIdle() ou WaitFor...Object() pour ne
pas geler l'interface graphique ou s'il existe un autre moyen
(par exemple recevoir un message) ?

Merci
--
Cyrille Szymanski
Avatar
Aurelien REGAT-BARREL
> J'aimerais savoir si on est obligés de créer un deuxième thread
qui bloque sur WaitForInputIdle() ou WaitFor...Object() pour ne
pas geler l'interface graphique ou s'il existe un autre moyen
(par exemple recevoir un message) ?



Faire des PeekMessage dans ta boucle principale pour détecter quand ta
propre appli est Idle et alors faire des Wait avec des timeout courts...

--
Aurélien REGAT-BARREL
Avatar
Arnaud Debaene
Cyrille Szymanski wrote:
Bonjour,

On 2005-02-23, Christian ASTOR a écrit:
Voila je voudrais savoir quelles fonctions utiliser en c++
pour ouvrir une application et attendre qu'elle soit chargée.



ShellExecuteEx() ou CreateProcess() + WaitForInputIdle()



J'aimerais savoir si on est obligés de créer un deuxième thread
qui bloque sur WaitForInputIdle() ou WaitFor...Object() pour ne
pas geler l'interface graphique ou s'il existe un autre moyen
(par exemple recevoir un message) ?



MsgWaitForMultipleObject(Ex), mais c'est assez délicat à mettre en oeuvre.
Je ne connais pas d'équivalent pour WaitForInputIdle.

Arnaud
MVP - VC
Avatar
Jean-Claude BELLAMY
Dans le message news:421cf9bd$0$8109$ ,
Arnaud Debaene s'est ainsi exprimé:

Cyrille Szymanski wrote:
Bonjour,

On 2005-02-23, Christian ASTOR a écrit:
Voila je voudrais savoir quelles fonctions utiliser en c++
pour ouvrir une application et attendre qu'elle soit chargée.



ShellExecuteEx() ou CreateProcess() + WaitForInputIdle()



J'aimerais savoir si on est obligés de créer un deuxième thread
qui bloque sur WaitForInputIdle() ou WaitFor...Object() pour ne
pas geler l'interface graphique ou s'il existe un autre moyen
(par exemple recevoir un message) ?



MsgWaitForMultipleObject(Ex), mais c'est assez délicat à mettre en
oeuvre. Je ne connais pas d'équivalent pour WaitForInputIdle.




Je viens de retrouver une appli assez délirante où je le fais .
Ce n'est pas si compliqué que çà !

C'est une appli d'exécution simultanée de n'importe quoi (word, powerpoint,
...) d'un même fichier copié sur plusieurs PC le tout synchronisé en
multicast.
(faire de la multidiffusion avec une grande économie réseau, seuls les
évenéments clavier et souris étant multidiffusés sur le réseau )
Donc l'appli est "à l'écoute" d'un ordre d'exécution d'une autre appli,
qu'elle doit donc lancer, mais elle doit contrôler sa fin d'exécution, tout
en ne restant pas bloquée.
Voici le passage intéressant (en Delphi) :

var
lBusy : DWORD;
StartInfo: TStartupInfo;
ProcessInformation: TProcessInformation;
begin
....
//lancement de la nouvelle appli (command contient l'exe + les paramètres)
if
CreateProcess(nil,Command,nil,nil,true,0,nil,nil,StartInfo,ProcessInformation)
then
begin
//récupération du handle de processus et ID de thread
with ProcessInformation do
begin
Process:=hProcess;
Thread:=hThread;
ProcessId:=dwProcessId;
ThreadId:=dwThreadId;
end;
WaitForInputIdle(Process,5000);
//recherche de la fenêtre principale de l'appli lancée
EnumThreadWindows(ThreadId,@EnumThreadWndProc,0);
//EnumThreadWndProc est une callback qui retourne le handle hWndProcess
//Focus et souris sur cette appli
Windows.SetFocus(hWndProcess);
SetCapture(hWndProcess);
//boucle d'attente
repeat
lBusy:=MsgWaitForMultipleObjects(1,Process,False,INFINITE,QS_ALLINPUT);
//on continue à traiter les messages de la présente appli
//la variable globale ForceStop est mise éventuellement à true
//par un message venant du réseau
Application.ProcessMessages;
Until (lBusy=WAIT_OBJECT_0) or ForceStop;
ReleaseCapture;
ForceStop:úlse;
end;
...
end;

--
--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*