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

Langage Java Discussion :

[RunTime]Probleme de communication avec exec


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 11
    Par défaut [RunTime]Probleme de communication avec exec
    Bonjour,

    Je suis actuelement sur un projet où je dois lancer un programme externe (en fortran) et communiquer avec lui.
    Ce programme fortran a une ihm en ligne de commande pour recuperer certaines informations comme le nom d'un fichier d'entrée et le nom du fichier de sortie.

    Je n'ai pas de probleme pour lancer ce programme externe mais je n'arrive pas a bien comuniquer avec lui.
    J'utilise le code suivant :

    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
     
          Runtime RT=Runtime.getRuntime();
          try {
              System.out.println("Debut recouvrement");
              Process P=RT.exec(Default_dir + "Essai/prog.exe");
              byte[] FichierE=(byte[])(Default_dir + "Essai/F0").getBytes();
              byte[] FichierS=(byte[])(Default_dir + "Essai/E0").getBytes();
     
              OutputStream out=P.getOutputStream();
              out.write('o');
              out.write(FichierE);
              out.write('1');
              out.write('n');
              out.write(FichierS);
              out.write('0');
              out.write('n');
              System.out.println(P.waitFor());
     
              System.out.println("Fin recouvrement");
     
            }
    J'essai donc d'envoyer successivement les "réponses" : 'o', 'FichierE' , '1' , 'n', 'FichierS' , '0', 'n' au programme Externe malheuresement sans succes.

    Est ce ma définition de out qui est movaise ?

    Merci pour 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,


    As-tu une exception pendant l'exécution ?
    Il ne faudrait pas utiliser un séparateur entre tes informations (style un '_n') ?

    Ton programme n'écrierait pas sur stdout/stderr ? Si tu ne les lit pas cela peut le bloquer...


    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 11
    Par défaut
    Non je n'ai pas d'exception du tout :/
    Par contre le WaitFor me bloc tout, je dois killer le processus via le manager des taches pour voir apparaitre le ("Fin recouvrement")
    Sinon d'apres ce que j'ai compris les getOutputStream() et getInputStream() jou le role de pipe entre mon programme et le processus donc je ne pense pas que cela gene si je ne lis pas les flux de sortie et d'erreur si ?
    En faite c'est la premiere fois que j'essai de communiquer avec le processus généré pas exec d'habitude je m'en sers juste pour lancer mes log html

  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 Zaitchev
    Par contre le WaitFor me bloc tout, je dois killer le processus via le manager des taches pour voir apparaitre le ("Fin recouvrement")
    Sinon d'apres ce que j'ai compris les getOutputStream() et getInputStream() jou le role de pipe entre mon programme et le processus donc je ne pense pas que cela gene si je ne lis pas les flux de sortie et d'erreur si ?
    Si !
    Et c'est surement la cause de ton programme se bloque !!!
    Les différents stream renvoyé par Process (getInputStream(), getOutputStream() et getErrorStream()) comporte un buffer interne qui contient les données en attendant qu'elle soit lu. Si ces données ne sont pas lu (par le programme Java ou le programme appellé selon le sens du flux), alors le programme qui les emets se retrouve bloquer en écriture ou en lecture jusqu'a ce que buffer soit vidé ou rempli...

    Malheureusement ces buffers sont plutôt petit (512 ou 1024 je crois), et si le programme que tu lances écrit beaucoups de caractères, il peut se retrouver bloquer en attente...

    Et comme tu fais un waitFor() ton application Java se retrouve également en attente dead-lock !!!

    Il faut donc que tu lises ces données (ou au pire que tu fermes explicitement ces streams).

    A noter également que ces flux (stdout et stderr) doivent être lu dans des threads parallèles pour éviter des dead-locks... Ou bien tu peux utiliser la classe ProcessBuilder de Java 5.0 qui permet de rediriger les erreurs dans stdout...

    a++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 11
    Par défaut
    Bon Pb résolu

    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
     
                     File F=new File(FichierS);
                     if(F.exists())F.delete();
     
                     P.getInputStream().close();
                     P.getErrorStream().close();
     
                     P.getOutputStream().write("o\n".getBytes());
                     P.getOutputStream().write(FichierE.getBytes());
                     P.getOutputStream().write("1\n".getBytes());
                     P.getOutputStream().write("n\n".getBytes());
                     P.getOutputStream().write(FichierS.getBytes());
                     P.getOutputStream().write("0\n".getBytes());
                     P.getOutputStream().write("n\n".getBytes());
                     P.getOutputStream().flush();
     
                     P.waitFor();
    Le flush manquais
    Effectivement le fait de fermer les pipes non utilisé est indispensable si je ne les lis pas !!
    Merci

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

Discussions similaires

  1. probleme de communication avec serveur Radius
    Par Abou Zar dans le forum Réseau
    Réponses: 0
    Dernier message: 11/05/2012, 09h17
  2. probleme de communication avec une balance
    Par jo9090 dans le forum LabVIEW
    Réponses: 1
    Dernier message: 17/02/2012, 11h44
  3. [Runtime] probleme avec l'execution d'un programme externe
    Par Jérémy Lefevre dans le forum API standards et tierces
    Réponses: 18
    Dernier message: 21/06/2007, 12h57
  4. [Système] Probleme de PATH avec la fonction exec
    Par Sylvain71 dans le forum Langage
    Réponses: 11
    Dernier message: 16/07/2006, 17h04
  5. [System][EXEC] Probleme d'execution avec une commande parametrée.
    Par chicorico dans le forum Général Java
    Réponses: 15
    Dernier message: 20/05/2005, 15h07

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