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

Composants VCL Delphi Discussion :

Attendre la fin du JvCreateProcess pour poursuivre l'exécution du code


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Par défaut Attendre la fin du JvCreateProcess pour poursuivre l'exécution du code
    Bonjour
    Je cherche à faire la chose suivante : je crée une boucle via un "for" qui parcourt une liste et quand il trouve le bon élément, il lance un process via un JvCreateProcess.
    Le problème est que le JvCreateProcess n'attend pas la fin de l'exécution du process en cours avant d'en lancer un nouveau, et par conséquent me crée une erreur.
    Y a-t-il un moyen d'attendre la fin du process (hors OnTerminate car je ne vois pas comment l'utiliser dans ma boucle) avant de poursuivre l'exécution du code ?
    Merci !

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Pour le JvCreateProcess je ne sais pas
    Mais pour le CreateProcess des API Windows (surement le même encpasuler)
    je te conseille la lecture de Redirection des entrées/sorties du process
    WaitForSingleObject INFINITE pour attendre la fin, cela bloque ton programme pendant ce temps
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Par défaut
    Merci pour cette réponse rapide
    J'ai déjà utilisé le CreateProcess par le passé si je ne me trompe pas, mais j'avais laissé tomber au profit du JvCreateProcess qui permettait de gérer rapidement quelques points.
    Si jamais je ne trouve pas de solution avec le Jv je retenterai le CreateProcess

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 607
    Billets dans le blog
    65
    Par défaut
    Bonjour ,

    si je comprend bien tu veux faire un "ExecuteandWait" ?

    avec CreateProcess voici un code j'utilise
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    unit Execute;
     
    interface
     
    uses
      Windows, SysUtils;
     
    function WinExecAndWait32(FileName:String; Visibility : integer): LongInt;
     
    implementation
     
    function WinExecAndWait32(FileName:String; Visibility : integer): LongInt;
    var
      zAppName:array[0..512] of char;
      zCurDir:array[0..255] of char;
      WorkDir:String;
      StartupInfo:TStartupInfo;
      ProcessInfo:TProcessInformation;
      Err : Cardinal;
    begin
      StrPCopy(zAppName,FileName);
      GetDir(0,WorkDir);
      StrPCopy(zCurDir,WorkDir);
      FillChar(StartupInfo,Sizeof(StartupInfo),#0);
      StartupInfo.cb := Sizeof(StartupInfo);
     
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := Visibility;
      if not CreateProcess(nil,
        zAppName,                      { pointer to command line string }
        nil,                           { pointer to process security attributes }
        nil,                           { pointer to thread security attributes }
        false,                         { handle inheritance flag }
        CREATE_NEW_CONSOLE or          { creation flags }
        NORMAL_PRIORITY_CLASS,
        nil,                           { pointer to new environment block }
        nil,                           { pointer to current directory name }
        StartupInfo,                   { pointer to STARTUPINFO }
        ProcessInfo) then Result := -1 { pointer to PROCESS_INF }
     
      else begin
        WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
        GetExitCodeProcess(ProcessInfo.hProcess,Err);
        result:=err;
      end;
    end;
     
    end.
    avec jvcreateProcess (qui fait la même chose )sauf que du coup il suffit de poser le composant , je crois qu'il faut simplement mettre la propriété waitforterminate à true

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Par défaut
    Merci pour cet exemple
    Oui en effet c'est ce que je veux faire car actuellement j'ai ce code (synthétisé) :
    for i:=0 to 10 do
    begin
    JvCreateProcess.CommandLine:='programme.exe --parametre '+IntToStr(i);
    JvCreateProcess.Run;
    end;
    Et le problème c'est que JvCreateProcess n'attend pas la fin de l'exécution du 1er avant de lancer le suivant, et le WaitForTerminate permet d'exécuter l'évènement "OnTerminate" ou alors j'ai loupé quelque chose ou je ne sais pas m'en servir

  6. #6
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Par défaut
    J'ai finalement fais d'une autre manière, synthétiquement et en gros ca donne ca :
    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
    procedure ExecuterCommandes
    begin
      for i:=0 to 10 do StringList1.Add(Commande_à_exécuter)
      Flag:=0;
      if StringList1.Count>0 then
        begin
          Flag:=1;
          JvCreateProcess1.CommandLine:=StringList1[Flag-1];
          JvCreateProcess1.Run;
        end;
    end;
     
    procedure JvCreateProcess1Terminate
    begin
      if StringList1.Count>Flag then
        begin
          Flag:=Flag+1;
          JvCreateProcess1.CommandLine := StringList1[Flag-1];
          JvCreateProcess1.Run;
        end else FlagCommand:=999;
      if Flag=999 then Sortie_de_la_liste_des_commandes_à_exécuter;
    end;
    Il manque un peu d'optimisation mais pour le moment ca fonctionne comme je le souhaite

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

Discussions similaires

  1. [PostgreSQL] Attendre la fin d'une requête avant de continuer le code
    Par renardchan dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/06/2011, 10h55
  2. [XL-2003] Attendre fin des calculs pour poursuivre la macro
    Par Cerize dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/12/2010, 09h51
  3. Réponses: 8
    Dernier message: 15/05/2008, 17h41
  4. [Servlet][Submit]Attendre la fin du traitement pour charger la page
    Par leminipouce dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/03/2008, 18h38
  5. Réponses: 19
    Dernier message: 13/01/2008, 23h33

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