Affichage des sorties d'un programme en C via un widget en SWT

Affichage des sorties d'un programme en C via un widget en SWT - Java - Programmation

Marsh Posté le 09-05-2007 à 13:27:46    

Bonjour tous le monde
 
Voila, mon petit probleme:
 
Je lance un programme C via la commande runtime ... et process de java, jarrive a afficher les message de sortie de ce programme avec des system.out.println... Mais a la place de mon system.out.println() j'aimerai pouvoir les afficher dans une fenetre que jai créer dans un Text (widget SWT).
Voici mon code...
 

Citation :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
 
public class RunStarGeneGUI {
 
 private Shell shell;
 private GridLayout gridLayout;
 private GridData gridData;
 private Display display;
 private String cmd;
 private Text allStarGene, term;
 
 /**
  * Constructeur
  * @param display Le display de la fenetre
  * @param cmd La commande a executer
  */
 public RunStarGeneGUI(Display display, final String cmd){
  this.display = display;
  this.cmd = cmd;
  this.initLayout();
  this.initShell();
  this.initRunStarGeneGUI();
  this.run();
  this.ear();
 }
 
 private void initShell(){
  // create the shell
  this.shell = new Shell(SWT.TITLE | SWT.CLOSE | SWT.RESIZE);
  this.shell.setText("Run of STARGene" );
  this.shell.setSize(517, 486);
  shell.setLayout(gridLayout);
 }
 
 private void initLayout(){
  this.gridLayout = new GridLayout();
  gridLayout.numColumns = 1;
   
  this.gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
 }
 
 private void initRunStarGeneGUI(){
  this.allStarGene = new Text(this.shell, SWT.H_SCROLL | SWT.V_SCROLL);
  allStarGene.setLayoutData(gridData);
  this.term = new Text(this.shell, SWT.H_SCROLL | SWT.V_SCROLL);
  term.setLayoutData(gridData);
 }
 
 public void run(){
  display.asyncExec (new Runnable () {
 
   public void run () {
    try{
     Runtime r = Runtime.getRuntime();
     Process p = r.exec(cmd);
     // Consommation de la sortie standard de l'application externe dans un Thread separe
     try {
      BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
      String line = "";
      try {
       while((line = reader.readLine()) != null) {
        System.out.println(line);
        /*
         * Ici j'aimerai faire un :
         * term.setText(line);
         * mais ça ne marche pas
         */
       }
      } finally {
       reader.close();
      }
     } catch(IOException ioe) {
      ioe.printStackTrace();
     }
 
    } catch (Exception e){
     System.err.println("Probleme"+e+": dans le lancement de StarGene avec la commande :"+cmd);
    }
   }
  });
 }
 
 // Affiche la fenetre
 private void ear(){  
  shell.open();
  while (!shell.isDisposed())
   if (!display.readAndDispatch())
    display.sleep();
 }
}

Reply

Marsh Posté le 09-05-2007 à 13:27:46   

Reply

Marsh Posté le 10-05-2007 à 16:53:01    

Bonjour,
a priori je ne vois pas de soucis.
 
Tu veux dire quoi par "mais ça ne marche pas"
 
Qu'es ce que qui ce passe ?

Reply

Marsh Posté le 11-05-2007 à 09:50:46    

Eh bien, il ny a rien qui s'affiche dans mon Text, et quand je quitte la fenetre contenant le Text il me sort une exception du type widgetIsDisposed ou quelque chose dans le genre...
Je pense ke le probleme viens de la synchronisation, jessay de modifier un widget pendant que lapplication sexecute, mais je ne sais pas comment faire..


Message édité par Jon Snow le 11-05-2007 à 09:52:10
Reply

Marsh Posté le 11-05-2007 à 15:54:51    

Bon je testerais plus du genre :  
StringBuilder sb = new StringBuilder();
 
       while((line = reader.readLine()) != null) {  
        System.out.println(line);  
        sb.append(line);
       }
 
       term.setText(sb.toString());  
 
 
Parce qu'en fait tu écrase la valeur du texte à chaque boucle, il suffit que le dernier texte soit vide, et tu vois rien.
Je me trompe peut être.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed