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 :

Précisions sur la class Process et la méthode waitFor()


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Par défaut Précisions sur la class Process et la méthode waitFor()
    Bonjour,

    Je souhaite lancer dans mon programme une application externe, et que le programme attende que celle ci se termine.
    Je pensais avoir compris l'utilisation de la méthode waitFor() de la classe Process mais après quelques jours passés sur ce problème...

    Citation Envoyé par Yann D'ISANTO, Developpez.com
    " la méthode waitFor() met le thread courant en attente que le processus de l'application externe se termine "
    Le bout de code que j'utilise est celui ci :

    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
     
    package fr.main;
     
    import java.io.File;
    import java.io.IOException;
     
    public class Run
    {
    public static void runSimulation(String dataIn, String dataOut, String pathWorkSpace) throws InterruptedException
    	{
    	String []simu ={"C:\\Program Files\\MonAppli\\src\\appliExterne.exe", pathWorkSpace}; // pathWorkSpace est un paramètre du .exe
    	try 
    	     {	
                 fr.utils.BufferedCopy.cp(dataIn,dataOut); // copie d'un fichier pour un paramètre du .exe
    	      Process sim = Runtime.getRuntime().exec(simu);
    	      sim.waitFor();
    	      } 
    	catch (IOException e)
    	     {
    	     System.err.println(e.getMessage());
    	     }
    	}
    }
    L'application externe le process "sim", dont l'exe prend en paramètre un espace de travail ainsi qu'un fichier que je crée lors de la copie (BufferedCopy.cp).

    Après lancement du .exe, je devrais avoir un fichier de calcul en sortie. Néanmoins je constate que le calcul n'est pas terminé et étant donné que l'application externe fonctionne bien toute seule je soupçonne que mon programme n'attende pas que cette appli externe se termine. J'ai mis un sim.waitFor(); dans cette optique, pour que le programme attende que l'appli externe se termine pour poursuivre.

    Est ce que lorsque j'ai codé :
    Process sim = Runtime.getRuntime().exec(simu);
    sim.waitFor();
    Cela veut bien dire que le programme attend que le process sim se termine pour continuer ?

    Merci par avance de votre aide !

  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 Pierre.B Voir le message
    Est ce que lorsque j'ai codé :
    Process sim = Runtime.getRuntime().exec(simu);
    sim.waitFor();
    Cela veut bien dire que le programme attend que le process sim se termine pour continuer ?
    Oui ! Pourquoi ce n'est pas le cas ???


    Attention toutefois à bien fermer les flux par sécurité si tu ne les utilises pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	      Process sim = Runtime.getRuntime().exec(simu);
    	      sim.getInputStream().close();
    	      sim.getOutputStream().close();
    	      sim.getErrorStream().close();
    	      sim.waitFor();
    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Par défaut
    Merci pour ta réponse,

    Non l'execution ne vas pas jusqu'au bout. La fichier de résultat en sortie s'arrête à une taille de 95ko au lieu des 950ko escomptés (représentant des pas de calculs sur 3 ans). Y'a t-il une limitation de la taille des fichiers lorsque l'on demande à une application externe de les créer ?

    Pour m'assurer que le problème ne viens pas du programme qui n'attendrais pas que le process s'arrête (et donc qui finirai pas les calculs), y'aurai t-il un moyen pour savoir quand le process d'application externe est terminé ?

    Citation Envoyé par Yann D'ISANTO, Developpez.com
    "la méthode exitValue() qui permet de récupérer la valeur de retour du processus de l'application externe "
    Je n'ai pas trouvé d'information plus pertinente sur cette méthode, permet-elle de renvoyer une valeur si le process est terminé ?

    En imaginant que le programme attend la fin du process, je me penche sur d'autres possibilités qui pourraient être la cause du problè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
    Citation Envoyé par Pierre.B Voir le message
    Non l'execution ne vas pas jusqu'au bout. La fichier de résultat en sortie s'arrête à une taille de 95ko au lieu des 950ko escomptés (représentant des pas de calculs sur 3 ans).
    Il faudrait avant tout savoir ce que fait ton application externe...

    Citation Envoyé par Pierre.B Voir le message
    Y'a t-il une limitation de la taille des fichiers lorsque l'on demande à une application externe de les créer ?
    Non...

    Citation Envoyé par Pierre.B Voir le message
    Pour m'assurer que le problème ne viens pas du programme qui n'attendrais pas que le process s'arrête (et donc qui finirai pas les calculs), y'aurai t-il un moyen pour savoir quand le process d'application externe est terminé ?
    waitFor() attend que le process d'arrête. Après il faudrait savoir ce que fait ce dernier : ne lances-il pas d'autres programmes ? Reçoit-il bien les bons paramètres, ne génère-t-il pas des erreurs, ecrit-il sur ces sorties (dans ce cas il faut les traiter), etc...


    a++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Par défaut
    Pour résumer sur l'application externe :

    Objet :
    - Maintien à poste d'un satellite

    Entrées :
    - Différents fichiers liés aux caractéristiques et contraintes de calculs
    (date de début de simulation, pas de temps, détails satellite, etc...)

    Paramètres pris par le .exe :
    - Un workspace où seront crées les sorties
    - Une copie d'un des fichiers d'entrées renommé en "_tmp" et se situant dans le workspace.

    Ce que fait le .exe :
    - Initialisation 1er cycle de calcul (lecture d'entrées et calculs)
    - Boucle tant que la date de fin de simulation n'est pas atteinte.

    Résultats : un calcul fait sur quelques mois au lieu des quelques années demandées. Et lorsqu'on fait tourner cette application externe (Fortran90) depuis sa propre interface (TCL/TK), tous les cycles de calculs sont effectués. Mais je doute que cette interface change quelque chose car elle l'équivalent dans son but à un objet Properties sous JAVA (remplir de texte un fichier d'entrées par exemple).

    Je vais prendre du recul et voir ce que je peux trouver...

    Merci pour ton aide en tout cas !

  6. #6
    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
    Aucun rapport en cas d'erreur ?

    a++

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

Discussions similaires

  1. Problème de Méthode sur la classe Session
    Par sniperseb dans le forum Hibernate
    Réponses: 2
    Dernier message: 04/01/2008, 16h48
  2. précision sur la valeur de retour de la méthode GetDirectories
    Par piotrr dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 21/06/2007, 14h07
  3. Réponses: 19
    Dernier message: 05/06/2007, 08h13
  4. précision sur le .class
    Par Kuroro dans le forum Langage
    Réponses: 3
    Dernier message: 14/03/2007, 16h14
  5. Création dynamique de méthode sur une classe ?
    Par elitost dans le forum Général Java
    Réponses: 9
    Dernier message: 18/10/2005, 14h47

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