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

API standards et tierces Java Discussion :

[Runtime] execution d'un .exe


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2004
    Messages : 114
    Par défaut [Runtime] execution d'un .exe
    Bonsoir,

    J'aimerais avoir votre aide concernant l'éxecution d'un programme .exe via la JVM.
    En fait le programme chess.exe est un programme indépendant qui prend ses données dans des fichiers textes et mets une réponse en fonction dans le fichier reponse.txt.

    Ce que je souhaite faire, c'est lancer le .exe lors du clic sur un objet et en fonction de la valeur ecrite dans reponse.txt je fais mes traitements.

    Le problème est que lorsque j'effectue cet appel le programme java se bloque et le fichier reponse.txt n'est pas crée.

    Mon code de départ était celui la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    try{
    		Runtime runtime = Runtime.getRuntime();
    		Process p = runtime.exec("C:\\Documents and Settings\\Louis-Alexandre\\Bureau\\CHESS\\CHESS\\CHESS\\chess.exe");
    		while(p.waitFor()!=0){System.out.println("proc en cours");}
     
    } catch (IOException e1) {
    	JOptionPane.showMessageDialog(null,"Error","Impossible de lancer le programme c",JOptionPane.ERROR_MESSAGE);
     
    } catch (InterruptedException e2) {
    	e2.printStackTrace();
    }
    Après m'être renseigné j'ai vu que je n'étais pas le seul a avoir le même problème et il faut lire les flux d'e/s pour les erreurs pour eviter que le buffer soit plein et bloque le programme.

    Voici le nouveau bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //On fais appel au programme C
    String args[] = new String[1];
    args[0] = "C:\\Documents and Settings\\Louis-Alexandre\\Bureau\\CHESS\\CHESS\\CHESS\\chess.exe";
     
    final CommandRunner runner = new CommandRunner(args, null);
     
    System.out.println("Attente de la fin du processus "+runner);
    runner.waitForCompletion();
    Les classes CommandRunner .. sont issus de ce site et permettent de bouffer les flux de sortie et d'erreur :
    http://sgamel.free.fr/spip.php?article38

    Le problème est que malgré tout cela je n'y arrive pas !

    Quelqu'un pourrait m'aider ?

  2. #2
    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,

    Citation Envoyé par allserv
    Le problème est que malgré tout cela je n'y arrive pas !
    Quels sont les symptômes exactement ? Exception ? Blocage du programme ? Etc...

    Et que fais ton programme C ? Est-ce qu'il utilise le flux d'entrée stdin (car d'après ce que j'ai vu ce n'est pas géré par la classe CommandRunner).


    Si tu utilises Java 5.0 ou plus, tu peux essayer avec cette librairie : Runtime.exec() n'est pas des plus simple...

    a++

  3. #3
    Membre confirmé
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2004
    Messages : 114
    Par défaut
    En fait, le fichier reponse.txt est crée mais le programme java n'arrive pas à ouvrir le fichier alors qu'il est bien présent.

    On dirait que le java n'arrive pas à savoir quand le processus est fini.

    Exemple lorsque je fais cela :

    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
     
    try{
    								Fichier reponse = new Fichier(this.dam.REPONSE);
    								reponse.delete();
     
    								Runtime runtime = Runtime.getRuntime();
    								runtime.exec("chess.exe");
     
     
    								while(p.waitFor()!=0){ System.out.println("proc actif");}
     
    								this.rep = reponse.lireDernierElem();
    							} catch (IOException e1) {
    								JOptionPane.showMessageDialog(null,"Error","Impossible de lancer le programme c",JOptionPane.ERROR_MESSAGE);
     
    							}
    Le prob est que ca affiche tt le tps "proc actif" :\ Comme si l'execution du programme ne s'était pas terminé.
    Pourtant le fichier chess.exe se lance et se ferme directement après lorsqu'on doublie clique dessus.

    D'ou ca pourrait venir ?

  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
    Citation Envoyé par allserv
    Le prob est que ca affiche tt le tps "proc actif" :\ Comme si l'execution du programme ne s'était pas terminé.
    Pourtant le fichier chess.exe se lance et se ferme directement après lorsqu'on doublie clique dessus.

    D'ou ca pourrait venir ?
    Il ne faut pas utiliser waitFor() dans une boucle puisque ce dernier bloque jusqu'à la fin du process et renvoi son code de retour. Donc si waitFor() te renvoi une valeur c'est que le process est terminé...


    Enfin si ton application C n'utilise pas ses flux stdin/stdout/stderr, je te conseille vivement de les fermer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	Runtime runtime = Runtime.getRuntime();
    	runtime.exec("chess.exe");
     
    	runtime.getOutputStream().close();
    	runtime.getInputStream().close();
    	runtime.getErrorStream().close();
     
    	p.waitFor();
    a++

  5. #5
    Membre confirmé
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2004
    Messages : 114
    Par défaut
    Merci ca fonctionne c'est parfait, on avait pensé utiliser la class thread pour attendre 3 secondes que le fichier soit créé.

    Merci

    Louis

Discussions similaires

  1. [VBA-E] executer un fichier exe
    Par darkman10 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 15/05/2006, 16h52
  2. [BP 7] Problème d'exécution de BP.exe sous Ms-Dos
    Par jeepou dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 11/05/2006, 10h06
  3. Problème lors de l'exécution d'un exe
    Par mbibim63 dans le forum JBuilder
    Réponses: 1
    Dernier message: 04/01/2006, 13h13
  4. [Runtime]Execution appli externe : commandes paramétrées
    Par BernardT dans le forum API standards et tierces
    Réponses: 15
    Dernier message: 16/08/2005, 11h14
  5. Réponses: 9
    Dernier message: 04/09/2004, 19h15

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