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

Java Discussion :

Mettre un process en pause


Sujet :

Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut Mettre un process en pause
    Bonjour à tous,

    J'ai une application JAVA qui effectue plusieurs taches dont une qui est l'éxecution d'un .bat (seul moyen trouvé pour lancer un script ANT). Le probléme et que mon application n'attend pas que l'éxecution du .bat soit terminée avant de passer à la suite.
    J'aimerais donc savoir si quelqu'un pouvait m'expliquer comment faire cela.

    Voilà un code d'exemple où j'aimerais que le "Hello Boys" ne s'affiche qu'une fois l'execution du bat terminée.
    Je pensais que le child.waitFor() servait à cela mais qu'il soit présent ou non cela ne change rien.

    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
    mport java.util.*; 
    import java.io.*; 
     
    class ExecutionBat extends Thread { 
    	public static void main(String[] args) {
            try {
     
            	String[] command = { "cmd.exe", "/C", "Start ant -buildfile", "../dossier/bin/build.xml" ,"compil" };
            	Process child = Runtime.getRuntime().exec(command);
            	child.waitFor();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
            System.out.println("Hello Boys");
        }
    }

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,
    Je ne suis pas un pro en exécution de processus, mais pour ton cas, regarde ce site, peut-être que c'est une meilleure solution pour lancer un script ant : http://www.onjava.com/pub/a/onjava/2...to.html?page=1 ou ici http://www.mail-archive.com/ant-user.../msg20036.html (voir réponses aussi)
    Tschau

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Et bien en fait j'ai déjà testé deux méthodes différentes mais aucune des deux ne m'a apporté entiérement satisfaction : la premiére fermait mon application une fois l'execution du script terminée, et la seconde (celle proposée dans tes liens) me retournait des erreurs qui n'apparraissaient pas lors d'un éxecution normale(sans passer par java) ou même grâce à la première solution...

    Mais merci quand même

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Lorsqu'on lance un programme externe il faut TOUJOURS gérer ses flux d'entrée/sorties :
    • En les traitant depuis des threads différents (si on veut les utiliser).
    • En les fermant si on veut les ignorer (mais on perdra alors les éventuels erreurs du programme appelé).


    Plus d'info sur developpez.com :


    a++

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Justement j'étais en train de lire ton billet sur le sujet adiGuba, mais je dois avouer que ça dépasse de loin mes connaissances. Alors il est vrai que je pourrais plancher là dessus mais hélas le temps n'est pas mon meilleur ami.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    En clair, quelle sont les étapes à suivre afin d'arriver au mieux à mes fins?

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    En relisant ton code j'ai vue un autre problème : tu utilises la commande DOS START qui sépare le processus : comme il n'est plus lié c'est normal que waitFor() rende la main de suite...

    En gros tu lances le shell (cmd.exe) qui lance ant en tâche de fond, et rend la main de suite...


    Si tu n'as pas besoin du shell, il est préférable d'appeler directement l'exécutable en séparant les paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] command = { "ant",  "-buildfile", "../dossier/bin/build.xml" ,"compil" };

    Si veux utiliser le shell (par exemple pour gérer des variables d'environnement ou des caractères spéciaux comme les pipes ou redirection), tu dois alors avoir 3 paramètres, et le troisième doit contenir la totalité de la ligne de commande tel qu'elle devra être interprétée :
    [code]String[] command = { "cmd.exe", "/C", "ant -buildfile ../dossier/bin/build.xml compil" };



    Par contre cela ne change rien au fait que tu doives traiter les flux de sortie, surtout que Ant peut générer un grand nombre d'information...
    Notes également que les chemins séparé par des "/" peuvent poser problèmes à certaines appli Windows...




    Si tu ne veux pas t'embêter avec la gestion des flux, tu as plusieurs solutions :
    • Utiliser un ProcessBuilder pour lancer le process, ce qui te permet de rediriger le flux d'erreur vers le flux de sortie standard, ce qui fait que tu n'a plus qu'un flux de sortie à traiter (je suppose que tu n'a rien à écrire dans le flux d'entrée, donc tu peux le fermer tout de suite).
    • Tu peux également utiliser ma librairie Shell (voir mon billet blog), qui simplifie ce genre de traitement.
      Par exemple tu as deux méthodes static permettant de faire des appels de base.
      Ainsi pour appeler directement la commande :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      int result = Shell.execute("ant",  "-buildfile", "../dossier/bin/build.xml" ,"compil");
      Ou pour interpréter une ligne de commande via le shell système (cmd.exe ou command.com selon les Windows, /bin/sh sur les autres systèmes) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      int result = Shell.system("ant -buildfile ../dossier/bin/build.xml compil");
      Par défaut le flux d'entré est fermé, et les flux de sorties sont reportés respectivement sur System.out et System.err...

      Tu peux changer cela en utilisant une instance de la classe Shell :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      	// L'instance qui gèrera les commandes :
      	Shell shell = new Shell();
       
      	// Le buffer qui contiendra la sortie standard :
      	StringBuilder stdout = new StringBuilder();
       
      	// Le buffer qui contiendra la sortie d'erreur :
      	StringBuilder stderr = new StringBuilder();
       
      	// création de la commande (on utilisera exec() pour appeler directement une programme) :
      	int result = shell.command("ant -buildfile ../dossier/bin/build.xml compil")
      		.output(stdout) // On redirige la sortie standard dans un StringBuilder
      		.error(stderr) // On redirige la sortie d'erreur dans un StringBuilder
      		.consume(); // On lance la commande en traitant les flux


    a++

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Merci pour tes réponses.

    Pour ce qui du Sheel, apparament oui je suis obligé de l'utiliser car ant n'est pas un exe mais un .bat, mon prog me renvoyait donc une erreur du type "ant n'est pas une application win32 valide".

    Pour ce qui du passage de paramétre (j'ai laissé Start pour voir le résultat), si je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] command = { "cmd.exe", "/C", "Start ant -buildfile ../dossier/bin/build.xml compil" };
    j'ai une erreur sous DOS qui m'indique qu'il y a une erreur d'argument, chose qui n'arrive pas si je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] command = { "cmd.exe", "/C", "Start ant -buildfile ../dossier/bin/build.xml", "compil" };,

    Pour ce qui est de ta librairie, j'avais essayé tout à l'heure dans un programme de test sans avoir réussi à faire ce que je voulais. Par contre je viens de retester et ça m'a l'air de trés bien fonctionné cette fois.
    Je test de suite ça dans mon programme principal et je rapporte les résultats aprés .

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Conclusion aprés premier essai : si tu étais à coté de moi, je t'embrasserai sur les deux joues .
    Voilà un probléme auquel j'étais confronté depuis quelques jours qui se résoud.

    Merci beaucoup!

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Message à adiGuba

    Etant donné que c'est toi qui a développé cette API, tu vas surement pouvoir me répondre sans trop de soucis
    Pourrais-tu m'indiquer dans quelle class attrape tu l'exeception du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Buildfile : build.xml does not exist!
    En fait j'aimerais que mon traitement s'arréte en cas de soucis de lancement du script ANT, mais je ne trouve pas où se trouve cette exception...

    Celle-ci est levée si la variable command ci-dessous contient une adresse éronnée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Shell.execute(command);
    Merci

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Alors là je ne comprend pas : j'ai testé tous les try catch de la class ProcessConsumer mais aucun ne semble correspondre à celui que je cherche , et aucune exception n'est attrapée dans les deux autres class...

    [EDIT]Même le result renvoyé lors du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = Shell.execute(command);
    ne m'aide pas. Il me retourne 0 même si command n'est pas bon...

  12. #12
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Micke7 Voir le message
    Pourrais-tu m'indiquer dans quelle class attrape tu l'exeception du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Buildfile : build.xml does not exist!
    En fait j'aimerais que mon traitement s'arréte en cas de soucis de lancement du script ANT, mais je ne trouve pas où se trouve cette exception...
    Ce n'est pas une exception, mais un simple message écrit dans le flux de sortie du programme.

    Si tu veux faire cela il faut rediriger la sortie du programme vers un StringBuilder, et analyser le contenu de cette dernière après la fin du traitement...

    Citation Envoyé par Micke7 Voir le message
    [EDIT]Même le result renvoyé lors du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = Shell.execute(command);
    ne m'aide pas. Il me retourne 0 même si command n'est pas bon...
    Il s'agit seulement de la valeur renvoyé par le programme à l'OS.
    Cela dépend donc de l'application appelé...


    a++

    PS : Tu veux intégrer ant dans ton appli c'est ca ? Il me semble qu'il existe une API Java pour cela...

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Comme je l'ai expliqué dans mon 2nd post, j'ai testé 2 API différentes pour mais aucune des deux ne fonctionnait convenablement. Je me suis donc rabattu sur le lancement de .bat.


    Si tu veux faire cela il faut rediriger la sortie du programme vers un StringBuilder, et analyser le contenu de cette dernière après la fin du traitement..
    Par sortie du programme tu fais bien référence à la sortie écran, ce qui s'affiche dans la console? Parce que j'ai trouvé où tu gérer ça mais je ne me suis pas encore penché sur comment intéragir avec.


    Dans tous les cas, encore merci pour ta disponibilité.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Tu as dit que mes liens te donnaient des erreurs, tu peux nous les donner peut-être que ca se résoud, non ?
    Je pense que ca serait plus "propre" d'utiliser une api java, étant donné que ant est en java...

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Et bien écoute, j'ai passé beaucoup trop de temps a essayé de trouver une solution pour lancer convenablement mes scripts Ant, alors maintenant que j'en ai une qui fonctionne je ne la lache plus .

Discussions similaires

  1. Mettre un listener en pause
    Par Djakisback dans le forum Composants
    Réponses: 4
    Dernier message: 12/12/2008, 22h14
  2. Mettre un thread en pause!
    Par Voldo dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 29/03/2008, 18h29
  3. Comment mettre une procédure en pause ?
    Par neuneu1 dans le forum Débuter
    Réponses: 5
    Dernier message: 18/10/2007, 02h31
  4. Mettre un SDL_Thread sur pause ?
    Par Franck.H dans le forum SDL
    Réponses: 6
    Dernier message: 14/12/2006, 14h44
  5. mettre un programme en pause
    Par jobherzt dans le forum C++
    Réponses: 16
    Dernier message: 13/07/2006, 20h38

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