2016-06-02 12 views
0

Ich benutze SWT in meinem Java-Code für meine GUI und im Ausführen eines Prozesses, dass sein Code in Python geschrieben ist. Ich benutze den Prozess Eingangsstrom, um die Drucke auf dem Prozess zu fangen und sie sofort in meine GUI zu schreiben.Schreiben Prozess Input Stream Daten zu GUI

mein Code:

in = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    String line; 
    while ((line = in.readLine()) != null) { 
     printToTerminal(line); 
    } 

und die printToTerminal Funktion:

protected void printToTerminal(String text) { 

     terminal.append(text + "\n"); 
     terminal.redraw(); 
     terminal.update(); 
    } 

Das Terminal ist ein Text-Objekt, das ich den Text anfügen möchte und dann zu zeigen, mit neu zu zeichnen und zu aktualisieren, um die Zeile sofort an den Benutzer. mein Problem ist, dass meine GUI wegen dieser while-Schleife stecken bleibt, die den Job macht und die Zeilen bekommt, aber ich kann nicht scheinen, die Lösung für das Erhalten der Zeilen zu erhalten, ohne meine GUI festzuhalten. Ich habe versucht, mit der display.async-Funktion und die While-Schleife enthalten, aber es hat noch nicht funktioniert und meine GUI blieb stecken.

Gibt es eine Möglichkeit, den Eingabestream für meinen Prozess zu erhalten und ihn auf meine GUI zu drucken, ohne ihn zu blockieren?

Danke für die Hilfe.

+0

Warum ist diese Frage mit Python markiert? – bgporter

+0

aus Versehen habe ich das Tagging –

Antwort

2

Wenn Sie lange laufenden Code im Benutzerschnittstellen-Thread ausführen, wird die Benutzeroberfläche blockiert. Sie müssen diesen Code also im Hintergrund ausführen. Sie können eine Thread (oder etwas wie CompletableFuture) verwenden. Wenn dies ein Eclipse-Plug-In ist, können Sie auch einen Job oder einen Fortschrittsmonitor verwenden.

In Ihrem Hintergrund-Thread rufen Sie Display.asyncExec an, um den Code auszuführen, der die Benutzeroberfläche aktualisiert (also nur den Anruf an printToTerminal hier).

Der Aufruf von Display.asyncExec wenn Code bereits im UI-Thread ausgeführt wird, funktioniert nicht.

+0

entfernt, wenn Sie also vorschlagen, printToTerminal innerhalb der while-Schleife in der Display.async-Funktion zu setzen? –

+1

Ja, Sie müssen Ihren Code in einem Hintergrundthread lesen. Jedes Mal, wenn Sie eine Zeile zur Benutzeroberfläche hinzufügen möchten, rufen Sie 'Display.asyncExec' (oder' Display.syncExec' auf, wenn Sie darauf warten möchten, dass sie angezeigt wird). –

+0

Danke, es hat perfekt funktioniert! –