Buffer Reader en temps réél

yelsi - 30 juil. 2012 à 09:54
 yelsi - 30 juil. 2012 à 16:07
Bonjour,

je suis en train de faire une applet qui exécute un '.exe' (Projet Console VC++), et qui doit afficher les sorties de l'application en temps réél. J'utilise donc un BufferReader, mais le problème est qu'il ne m'affiche pas les sorties en "temps réél" : j'ai l'impression qu'il attend la fin du programme pour afficher tous les messages qu'il a reçu. Voici le code que j'utilise :
public class Configurateur extends JApplet{
//private JLabel label = new JLabel();
private JTextArea _resultArea = new JTextArea();
/**
 * Serial
 */
    private static final long serialVersionUID = 806957495884774321L;


private String mesg="Initialisation ...\n";
private String commande = "C:\\conf\\conf_HR_TUS.exe";
private String port_com;
private String id_hr_tus;
private String param_radio;
private String param_algo;
private Runtime r;
private Process p;
private BufferedReader reader;
    
public void write(String nomFic, String texte)
{
//on va chercher le chemin et le nom du fichier et on me tout ca dans un String
String adressedufichier = "C:\\conf\"+ nomFic;

//on met try si jamais il y a une exception
try
{
/**
 * BufferedWriter a besoin d un FileWriter, 
 * les 2 vont ensemble, on donne comme argument le nom du fichier
 * true signifie qu on ajoute dans le fichier (append), on ne marque pas par dessus 
 *
 */
FileWriter fw = new FileWriter(adressedufichier, true);

// le BufferedWriter output auquel on donne comme argument le FileWriter fw cree juste au dessus
BufferedWriter output = new BufferedWriter(fw);

//on marque dans le fichier ou plutot dans le BufferedWriter qui sert comme un tampon(stream)
output.write(texte);
//on peut utiliser plusieurs fois methode write

output.flush();
//ensuite flush envoie dans le fichier, ne pas oublier cette methode pour le BufferedWriter

output.close();
//et on le ferme
System.out.println("fichier créé");
}
catch(IOException ioe){
System.out.print("Erreur : ");
ioe.printStackTrace();
}

}
    
    
 
    public void init() { 
    	
this.setSize(600, 600);

        //_resultArea.setText("Enter more text to see scrollbars");
        
        
        // ... Get the content pane, set layout, add to center
        JPanel content = new JPanel();
        JScrollPane scrollingArea = new JScrollPane(_resultArea);
        scrollingArea.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        _resultArea.setPreferredSize(new Dimension(600, 600));
        _resultArea.setMaximumSize(new Dimension(600, 600));
        _resultArea.setEditable(false);
        
        //content.setLayout(new BorderLayout());
        content.add(scrollingArea, BorderLayout.CENTER);
        
        // ... Set window characteristics.
        this.setContentPane(content);
        
// On centre le texte du JLabel et on écrit en bleu...
_resultArea.setAlignmentX(JTextArea.CENTER_ALIGNMENT);
// C'est plus zoli. 
_resultArea.setBackground(Color.cyan);


// Scrolling
  _resultArea.append(mesg);
          _resultArea.setCaretPosition(_resultArea.getDocument().getLength());


this.getContentPane().add(_resultArea, BorderLayout.NORTH);

 port_com=getParameter("port_com");
 id_hr_tus=getParameter("id_hr_tus");
 param_radio=getParameter("param_radio");
 param_algo=getParameter("param_algo");
     _resultArea.append("Lancement du configurateur en cours...\n");
     _resultArea.setCaretPosition(_resultArea.getDocument().getLength());
    }
    
    public void start(){

 try
        {
         r = Runtime.getRuntime();
         p = null;
          //
 		  if (port_com==null||param_radio==null||param_algo==null){ 
 			 p = r.exec(new String[] {commande});
 	  }
 		  else if(id_hr_tus==null){
 			 p = r.exec(new String[] {commande, port_com, param_radio, param_algo});
 		  }
 	      else{
 	  
 			 p = r.exec(new String[] {commande, port_com, id_hr_tus, param_radio, param_algo});
 		  }
 	  	  //*/
        
          
          //p.getOutputStream().close();
          //p.getErrorStream().close();
          //p.waitFor();
        }
        catch(Exception e)
        {
        	mesg = "Erreur ouverture fichier '.exe'";
            _resultArea.append(mesg + "\n");
            _resultArea.setCaretPosition(_resultArea.getDocument().getLength());
        	e.printStackTrace();
        }   
 new Thread(){
 public void run(){
          try {
        	  reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        	  //System.out.println("reader.readline()=" + reader.readLine());
        	  String line = "";
        	  try {
        		  line = reader.readLine();
        	  while(line!=null) {
        	  // Traitement du flux de sortie de l'application si besoin est
                  _resultArea.append(line + "\n");
                  _resultArea.setCaretPosition(_resultArea.getDocument().getLength());
                  //write("res.txt", line+ "\n");
                  line = reader.readLine();
        	  }
        	  } finally {
        	  reader.close();
        	  }
        	  } catch(IOException ioe) {
        	  ioe.printStackTrace();
        	  }

    }
 }.start();
    }
}
    


Si quelqu'un a une idée, je lui serais reconnaissant de m'en faire part.
Merci d'avance.

4 réponses

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
30 juil. 2012 à 11:06
Test avec un simple InputStreamReader et affiche caractère par caractère. Tu n'as peut-être pas de saut de ligne dans ton stream.
0
C'est vrai! Je crois que j'ai confondu entre une lecture sur fichier et une lecture sur un flux de sortie : Java ne voit pas les '\n' que j'ai glissés dans les printf de mon appli comme des sauts de ligne. Par contre, si j'essaye de le faire caractère par caractère, ça ne résout pas le problème puisqu'il est toujours bloqué jusqu'à la terminaison du programme.

new Thread(){
 public void run(){
          try {
        	  //System.out.println("avant InputStreamReader");
        	  reader = new InputStreamReader(p.getInputStream());
        	  //System.out.println("apres InputStreamReader");
        	  //System.out.println("reader.readline()=" + reader.readLine());
        	  char car= 0;
        	  //String line = "";
        	  try {
        		  car =  (char) reader.read();		        		  
        		  while(car!=65535) {
        			  //line=line+car;
        			  System.out.print(car);
        			  /*if(car=='\n'){
        				  _resultArea.append(line);
        				  _resultArea.setCaretPosition(_resultArea.getDocument().getLength());
        			  }*/
        			  car = (char) reader.read();
        	  	 }
        	  }
        	  finally {
        	  reader.close();
        	  }
        	  } 
          	catch(IOException ioe) {
        	  ioe.printStackTrace();
        	}

    }
 }.start();


En tout cas merci beaucoup pour ton aide.
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
30 juil. 2012 à 14:58
si tu lance l'exe manuellement, tu as la sortie au fur et à mesure ?
0
Oui bien sur! D'ailleurs pour simplifier j'ai pris un programme très simple :

#include "stdafx.h"
#include "string.h"
#include <Windows.h>


int main(int argc, char* argv[])
{
printf_s("Programme toto\r\n");
for(int i =0;i<5;i++){
printf_s("Attendre 5 s....\r\n");
Sleep(5000);
}
printf_s("Fin de toto\r\n");
return 0;
}


J'ai testé le .exe manuellement et j'obtiens un affichage cohérent.
0
Rejoignez-nous