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

Entrée/Sortie Java Discussion :

Problématiques de process et pipe


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut Problématiques de process et pipe
    Bonjour,

    voila j'ai un petit programme que je souhaite lancer avec une IHM. Seul pb il ne s'agit pas d'un ligne de commande mais d'une interface de dialogue.

    Je pensais donc utiliser ce petit bout de code pour essayer de piper le sous process lancé mais dès que j'arrive à la lecture ça bloque. En revanche si j'enlève la partie pour envoyer des donnez au programme (du style je récupère simplement la sortie du commande, la ca ne bloque plus...je ne comprends rien) voici le code :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    try {                        
            Process p = Runtime.getRuntime().exec("./dial2");
            /* Thread t1 = new write(p), t2 = new read(p); */
     
            // Creation des flux
            BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));        
            BufferedWriter stdOutput = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));         
            BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
     
            // read the output from the command
            int i = 0;
            while (i<100)
              {
                System.out.println("java -> " + i);
                st = ""+i;
                i++;
     
                // Envoie des donnees
                stdOutput.write(st, 0, st.length());
                stdOutput.newLine();
                stdOutput.flush();
     
                // Reception
                System.out.print("C -> ");            
                while ((s = stdInput.readLine()) != null) {
                  System.out.println(s);
                }
              }
     
            System.exit(0);        
          } catch (IOException e) {
            System.out.println("exception happened - here's what I know: ");
            e.printStackTrace();
            System.exit(-1);
          }
    J'ai aussi tenté en séparant tout cela et en utilisant des threads -> même pb

    merci pour votre aide

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    c'est bon j'avais oublier de flusher dans les threads

    voici la solution :

    principal :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    import java.io.*;
     
    public class ihm {
     
      public static void main(String args[]) throws InterruptedException
      {
        String s = null, st;
     
        try 
          { 
            // Creation du processus
            Process p = Runtime.getRuntime().exec("./dial");
     
            // Creation et lancement des threads de communication
            Thread t1 = new write(p), t2 = new read(p);
            t1.start();
            t2.start();
     
            // On attends la fin du dialogue pour quitter l'application
            t1.join();
            t2.join();
            System.exit(0);
     
            }
        catch (IOException e) {
          System.out.println("exception happened - here's what I know: ");
          e.printStackTrace();
          System.exit(-1);
        }
      }
    }
    write :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    import java.io.*;
     
    public class write extends Thread
    {
      Process p;
      write(Process p)
      {
        this.p = p;
      }
     
      public void run() {
        try {
          // Creation du flux d'ecriture
          String st;
          BufferedWriter stdOutput = new BufferedWriter(new 
                       OutputStreamWriter(p.getOutputStream()));
     
          // Boucle test
          int i = 0;
          while (i<100)
            {
              // Affichage sur l'ecran
              System.out.println("java -> " + i);
              st = ""+i+"\n";
     
              // MAJ
              i++;
     
              // Envoie sur le PIPE
              stdOutput.write(st, 0, st.length());
              stdOutput.flush();
            }
     
          // Declaration de fin de com.
          st ="fin\n";
          stdOutput.write(st, 0, st.length());
          stdOutput.flush();
        }
        catch (IOException ioe) {
          ioe.printStackTrace();
        }
      }
    }
    read :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    import java.io.*;
     
    public class read extends Thread
    {
      Process p;
      read(Process p)
      {
        this.p = p;
      }
     
      public void run()
      {
        try 
          {
            // Initialisation du flux de reception
            String s = "";
            BufferedReader stdInput = new BufferedReader(new 
               InputStreamReader(p.getInputStream()));
     
     
            while (((s = stdInput.readLine()) != null) && (s.indexOf("str = fin") != -1)) {
              System.out.println("C-> " + s);
            }
     
          }
        catch (IOException ioe) 
          {
            ioe.printStackTrace();
          }
      }
    }

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

Discussions similaires

  1. Probleme de pipe et de process pere-fils sous Windows
    Par Ipone dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 14/04/2010, 12h52
  2. Module IO:Pipe engendre des process zombie
    Par Jjeje007 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 16h28
  3. pipe / thread /process /abus de language
    Par emardjean dans le forum MFC
    Réponses: 4
    Dernier message: 17/01/2006, 14h20
  4. redirection pipe process perl shell...
    Par r-valkien dans le forum Programmation et administration système
    Réponses: 10
    Dernier message: 11/08/2005, 00h19
  5. Réponses: 3
    Dernier message: 09/02/2004, 14h35

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