Thread für CMD Ausgabe in TextArea

sandaime

Grünschnabel
Hallo liebe community,

ich habe eine Methode erstellt, was eine exe startet, welches in der Konsole läuft. Im weiteren wird in die Konsole ein Pfad eingegeben, womit dann das Programm eine Berechnung startet. Die Werte für die Berechnung entnimmt die Exe einer txt Datei. Naja das Problem hierbei ist, dass ich die Konsolenausgabe mir in die eine TextArea ausgeben will und das natürlich in Echtzeit.
Mit meiner Methode funktioniert die Ausgabe in der Konsole von Eclipse, aber nicht in meiner TextArea und ich habe zurzeit überhaupt keine Idee wieso. Nun habe ich nur noch wenig Zeit für meine Bachelorarbeit und stehe unter Druck. Ich hoffe ihr könnte mir aktiv helfen.

Danke an alle dir mir helfen und an die die sich wenigstens das Problem durchlesen :)
Java:
private void KonsoleEingabe(boolean neustart) {

        String austalPfad = cf.pathToAustalExe;
        String austalDirectory = curProjektPfad.split("austal2000.txt")[0];


        if (curProjektPfad == null) {
            JOptionPane.showMessageDialog(this, "Es ist kein Projekt ausgewählt oder erstellt worden!");
        } else {
            // TODO Thread einbauen
            // ProcessBuilder auf thread umstellen und asynchron in das TextFeld ergebnisAusgabe schrieben mittels .append
            // Siehe JavaCommandLineWrapperExample Zeile 80ff.
            ProcessBuilder builder = null;
            if( neustart ){
                builder = new ProcessBuilder(austalPfad,"-D", austalDirectory);
            } else {
                builder = new ProcessBuilder(austalPfad, austalDirectory);
            }
          
            builder.redirectErrorStream(true);
            Process p = null;
            try {
                p = builder.start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = null;
            while (true) {
                try {
                    line = r.readLine();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if (line == null) {
                    break;
                }
                //ergebnisAusgabe.append(line);
                ergebnisAusgabe.setText(line);
                System.out.println(line);
            }
        }
    }
 
Moin,
Mit meiner Methode funktioniert die Ausgabe in der Konsole von Eclipse, aber nicht in meiner TextArea
sprichst Du hier von:
Java:
ergebnisAusgabe.setText(line);
Wie ist "ergebnisAusgabe" deklariert?
Wo/wie wird "ergebnisAusgabe" dargestellt?
Möglicherweise muss das entsprechende Panel neu gezeichnet werden ....

Gruß Klaus
 
Ich vermute daran liegt es nicht, weil wenn die Berechnung beendet wurde werden die Einträge angezeigt auch im Panel. Nur während Berechnung werden die Ausgaben der CMD Konsole nur in der Eclipse Konsole angezeigt (in Echtzeit). In der TextArea sind die nur zu sehen nachdem alles durchlaufen wurde

Gruß
Sandaime
 
Leider hat es nicht funktioniert. Ich muss irgendwie einen thread einbauen, weil währen der Berechnung die GUI einfriert da die schleife durchlaufen wird.
 
Ich habe hier die Lösung.
Wie zu sehen ist rufe ich die methode auslese() in der methode konsoleEingabe()


Code:
public void konsoleEingabe(boolean neustart) {

        String austalPfad = cf.pathToAustalExe;
        String austalDirectory = curProjektPfad.split("austal2000.txt")[0];


        if (curProjektPfad == null) {
            JOptionPane.showMessageDialog(this, "Es ist kein Projekt ausgewählt oder erstellt worden!");
        } else {
            ProcessBuilder builder = null;
            if( neustart ){
                builder = new ProcessBuilder(austalPfad,"-D", austalDirectory);
            } else {
                builder = new ProcessBuilder(austalPfad, austalDirectory);
            }
        
            builder.redirectErrorStream(true);
            Process p = null;
            try {
                p = builder.start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          auslesen(p);
        }
    }
  
  
    // Ein Thread ist noetig in Swing nutzung weil sonst die GUI blockiert wird
    // deswegen laeuft die Methode seperat
     void auslesen(final Process p) {
    Executors.newSingleThreadExecutor().execute(new Runnable() {
    public void run(){
         BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
         String line = null;
         while (true) {
             try {
                 line = r.readLine();
              
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
             if (line == null) {
                 break;
             }
             ergebnisAusgabe.append(line+"\r\n");
         }
     }
});
}
auf , das muss so sein weil Swing probleme bei solchen sachen hat. Für genaueres siehe --> http://openbook.rheinwerk-verlag.de...19_026.htm#mjff97f42688ce8483476fd5597042a972.
 
Zurück