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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 14
    Points
    14
    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 sénior
    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
    Points : 23 190
    Points
    23 190
    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 à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 14
    Points
    14
    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 sénior
    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
    Points : 23 190
    Points
    23 190
    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 à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 14
    Points
    14
    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 sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Aucun rapport en cas d'erreur ?

    a++

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    Non, aucun rapport d'erreur. Un simple arrêt du calcul à la fin d'un cycle.

    Ce qui embrouille un peu plus c'est que le nombre de calcul varie de façon "hasardeuse". Des fois le fichier résultats de sortie comporte 3 mois de calcul, parfois 3 mois et demi.
    C'est comme si l'on avait pris la main sur ce calcul et qu'il s'était avait arrêté de boucler, mais je ne vois pas comment c'est possible au vue du code exposé.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    Je rajoute qu'en mettant :
    sim.waitFor();
    System.out.println("Sim terminée");

    On observe que le le print n'est jamais exécuté, donc on attend bien que l'application se termine (mais qui ne prend pas plus de 5min pour autant de calcul).

  9. #9
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Donc il y a un problème avec ton application... Mais si cette dernière ne génère aucune erreur alors cela ne va pas être évident à trouver...

    a++

  10. #10
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    On dirait bien qu'il s'agit tout simplement du cas classique des flux de sortie et d'erreur qui ne sont pas fermés.
    Si les flux ne sont pas lus ou fermé il finissent par remplir le buffer qui leur est alloué et l'application se bloque en plein milieu de son fonctionnement(ce qui expliquerait la petite taille du fichier) et ne se termine jamais (ce qui expliquerait que ton message ne s'affiche pas).

    A tu bien fermé les flux, comme te l'a suggéré Adiguba a sa première réponse?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    On s'approche de la solution.

    Je n'ai pas fermé les flux dans la mesure où ce qui sort de cette application génère les fichiers résultats.

    Dans le cas où les flux sont fermés :
    sim.getInputStream().close();
    sim.getOutputStream().close();
    sim.getErrorStream().close();
    sim.waitFor();
    System.out.println("Sim terminée");

    On arrive bien au print, alors que si on les ferme pas on n'y arrive pas.
    Néanmoins on fermant les flux il n'y a plus aucun fichiers résultats.

    Ce qui m'amène à penser à ce que tu dis Uther concernant les buffer alloué qui seraient pleins. J'imagine qu'il est possible de régler leur taille et donc de régler le problème ! Je continue sur cette piste.

    Merci !

  12. #12
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pierre.B Voir le message
    Je n'ai pas fermé les flux dans la mesure où ce qui sort de cette application génère les fichiers résultats.
    Les flux DOIVENT impérativement être fermé OU traité ! On ne peut pas les ignorer...


    Citation Envoyé par Pierre.B Voir le message
    On arrive bien au print, alors que si on les ferme pas on n'y arrive pas.
    Donc cela signifie que ton application utilise bien ses flux d'E/S !!!

    Il faut les traiter correctement pour voir ce que cela donne !

    a++

  13. #13
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    Citation Envoyé par Pierre.B Voir le message
    On arrive bien au print, alors que si on les ferme pas on n'y arrive pas.
    Néanmoins on fermant les flux il n'y a plus aucun fichiers résultats.
    Ce comportement ne me semble pas normal, les flux de sortie ne correspondent pas aux fichiers que l'application écrit directement, mais aux données envoyées sur la console( ou le fichier/processus vers lequel elle a été redirigée).
    Peut être que le fait de fermer ces flux a un implact sur ton application. Tu devrais plutôt les lire pour voir ce qu'ils contiennent.

    Citation Envoyé par Pierre.B Voir le message
    Ce qui m'amène à penser à ce que tu dis Uther concernant les buffer alloué qui seraient pleins. J'imagine qu'il est possible de régler leur taille et donc de régler le problème ! Je continue sur cette piste.
    Ces buffers étant normalement gérés par l'OS, il n'y a pas moyen de configurer leur taille.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    Problème résolu !

    C'est mon absence de gestion des flux qui était la cause du problème ! Je pense que le flux de sortie ne devait pas être lu assez rapidement (ou pas du tout) ce qui a bloqué le buffer.

    Merci beaucoup pour m'avoir aiguillé sur toutes ces pistes et m'avoir accompagné dans la démarche, j'ai appris les bases de la gestion de Thread en l'applicant à mon code, où j'ai pu créer dans un Thread différent pour la gestion des flux nécessaires, fermant celui qui ne m'interesse pas.

+ 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