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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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++

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