IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Savoir si une app a été complètement chargée


Sujet :

Delphi

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Points : 241
    Points
    241
    Par défaut Savoir si une app a été complètement chargée
    Salut

    Si j'exécute une application avec CreateProcess ou ShellExecute, il y a aucune manière de savoir si elle a été completement chargée?

    C'est que je dois faire et récupérer le handle de ça fenêtre principale pour la positionner dans l'écran (vous m'avez aider perfaitement ici et ça fonctionne genial), mais ce qui ennuye c'est devoir mettre le sleep

    Merci à l'avance

  2. #2
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    On peut en mettre plusieurs (même si avec un seul on est bien tenu....désolé) pour optimiser.

    Du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      ShellExecute(...)
      for i := 1 to 40 do
        begin
        H := FindWindows( ... )
        if H est OK
          then Break;
        Sleep( 50 );
        end;
    Cela te permet non seulement, d'attendre le minimum de temps, et d'imposer malgré tout un Time-out.
    Dans ce cas par exemple, on peut attendre uniquement 50ms, ou bien sinon, au bout de 2sec (faut penser aux machines lentes) on arrete car il y a du avoir un probleme... Les machines rapides, n'attendront pas 2 sec.
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    salut,
    Fais une recherche avec WinExecAndWait , tu devrais pouvoir résoudre ton problème .

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    j'ai retrouvé le vieux topic qui fait reference à cette fonction:

    http://www.developpez.net/forums/arc...php/t-516.html

    ça nous rajeunit pas tout ça........

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Points : 241
    Points
    241
    Par défaut
    Bonjour et merci pour les réponses

    Bobx: la fonction WinExecAndWait se qu'elle fait est exécute une application et attendre qu'elle finie. Je ne veux pas qu'elle finie, je veux qu'elle finie de se charger et qu'elle affiche son form principal

    TicTacToe: j'ai déjà essayer ça. Je fait ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    function ExecuteAndWaitLoad(const CommandLine: string) : cardinal;
    var
      zAppName: array[0..512] of char;
      StartupInfo: TStartupInfo;
      ProcessInfo: TProcessInformation;
      i: integer;
      H: HWND;
    begin
      StrPCopy(zAppName, CommandLine);
     
      FillChar(StartupInfo, Sizeof(StartupInfo), #0);
      StartupInfo.cb := Sizeof(StartupInfo);
     
      if not CreateProcess(nil, zAppName, nil, nil, false, 0, nil, nil, StartupInfo, ProcessInfo) then
      begin
        Result := 0;
        exit;
      end
      else
      begin
        for i := 1 to 10 do
        begin
          H := FindWindow(nil, 'kk');
          if H <> null then Break;
          Sleep( 1000 );
        end;
      end;
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      ExecuteAndWaitLoad('"D:\Ofimatica\Acrobat 7.0\Acrobat\Acrobat.exe" "e:\t4AdSO.pdf"');
     
      ShowMessage('end');
    end;
    Il n'existe aucune fenetre avec le titre kk mais H est différent de null parce que la fonction n'atteint pas les 10 seconds pour exécuter le ShowMessage

    Je ne comprends pas qu'est-ce qu'il passe. Aucune idée?

    Merci a tous

    Salut

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut,

    Juste après ton CreateProcess j'utiliserais un WaitForSingleObject.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      if CreateProcess(nil, PChar(CmdLine),nil,nil,True,0,nil,nil,SI,PI)
      then
        result := WaitForSingleObject(PI.hProcess, 5000)
      else
        Result := 1;
    WaitForSingleObject renvoie:
    WAIT_OBJECT_0 si le process est chargé
    WAIT_TIMEOUT si le délai est dépassé (5 secondes dans mon exemple)
    WAIT_ABANDONED si le process n'a pas démarré (mutex)
    WAIT_FAILED en cas d'échec.

    @+ Claudius

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Points : 241
    Points
    241
    Par défaut
    Merci Claudios40 pour ta réponse

    J'ai changé la fonction por celle ci pour faire un essay

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    function ExecuteAndWaitLoad(const CommandLine: string; memo: TMemo): cardinal;
    var
      zAppName: array[0..512] of char;
      StartupInfo: TStartupInfo;
      ProcessInfo: TProcessInformation;
      i: integer;
      H: HWND;
    begin
      StrPCopy(zAppName, CommandLine);
     
      FillChar(StartupInfo, Sizeof(StartupInfo), #0);
      StartupInfo.cb := Sizeof(StartupInfo);
     
      if not CreateProcess(nil, zAppName, nil, nil, false, 0, nil, nil, StartupInfo, ProcessInfo) then
      begin
        Result := 0;
        exit;
      end
      else
      begin
        repeat
          Result := WaitForSingleObjectEx(ProcessInfo.hProcess, 40, true);
          case Result of
            WAIT_OBJECT_0: memo.Lines.Add('WAIT_OBJECT_0');
            WAIT_TIMEOUT: memo.Lines.Add('WAIT_TIMEOUT');
            WAIT_ABANDONED: memo.Lines.Add('WAIT_ABANDONED');
            WAIT_FAILED: memo.Lines.Add('WAIT_FAILED');
            WAIT_IO_COMPLETION: memo.Lines.Add('WAIT_IO_COMPLETION');
            else memo.Lines.Add('¿erreur?');
          end;
     
          Application.ProcessMessages;
        until Result = WAIT_OBJECT_0;
      end;
    end;
    et je vois dans le memo toujours WAIT_TIMEOUT juste au moment que je fermer l'appli que je vois WAIT_OBJECT_0

    Merci de toute façon

    Une autre idée?

    Merci a l'avance

    Salut

  8. #8
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Salut, bon moi je reste sur ma lancée,
    Avec shell execute.

    Eventuellement, je l'avais vu il y a un paquet de temps, et peut-être peux tu jeter un coup d'oeil sur les sources de mon 1er défi, ou j'utilise des fonctions (que j'ai repris d'ancien projets), justement pour être sur que le démineur est lancé....

    Les sources sont

    Regarde plus précisément les fonctions
    - Lancer
    - ApplicationActive

    Bon code !
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut,

    Je reviens à la charge. Je n'est pas regardé ce que te propose TicTacToe peut-être as-tu trouver ton bonheur ?

    Effectivement l'utilisation de WaitForSingleObject n'était pas la solution (puisque cette fonction attends la fin du process ).
    A la place tu peux utiliser WaitForInputIdle qui est plus approprié.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    function LaunchAndWait(const NomFichier:string; dwDelai: Cardinal): Cardinal;
    var
      SI : TStartupInfo;
      PI : TProcessInformation;
    begin
      ZeroMemory(@SI, SizeOf(SI));
      SI.cb := SizeOf(SI);
     
      if CreateProcess(nil, PChar(NomFichier),nil,nil,True,0,nil,nil,SI,PI)
      then
        Result := WaitForInputIdle(PI.hProcess, dwDelai)
      else
        Result := WAIT_FAILED;
    end;
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      case LaunchAndWait('Calc.exe', 2000) of
        0: ShowMessage('OK ready !');
        WAIT_FAILED: ShowMessage('Echec !');
        WAIT_TIMEOUT: ShowMessage('Délai dépassé');
      end;
    end;
    @+ Claudius.

  10. #10
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Points : 241
    Points
    241
    Par défaut
    Salut tous

    Je veux remercier vos aides

    Bon, j'ai regarde et essayer le code de TicTacToe. Il n'utilise pas la fonction FindWindows, il fait une recherche par tous les fenetres avec EnumWindows. Ça fonctionne tres bien, merci

    J'ai aussi essayer le code de Claudius40, est a dire, la utilisation de la fonction WaitForInputIdle. J'avais vu cette fonction déjà dans le MSDN et je l'avais essayer mais.... sans succès. Le probleme est l'appli que j'exécute qu'elle est un video en format propriétaire (est un .exe qui a le visualisateur et le video tout ensemble), mais avec les autres apps "normales" Windows fonctionne a la perfection

    Merci a tous

    Salut

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Savoir si une connection est établie sur un port
    Par Malone dans le forum Web & réseau
    Réponses: 3
    Dernier message: 06/12/2003, 08h22
  2. Comment savoir si une impression s'est bien déroulé?
    Par Cyrilh7 dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/11/2003, 20h49
  3. Comment savoir qu'une fonction est standard ?
    Par D[r]eadLock dans le forum C
    Réponses: 5
    Dernier message: 24/03/2003, 14h42
  4. [VB6] [Impression] Savoir si une imprimante est installée
    Par Norm59ttp dans le forum Installation, Déploiement et Sécurité
    Réponses: 2
    Dernier message: 19/12/2002, 09h29
  5. Réponses: 4
    Dernier message: 10/09/2002, 17h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo