2009-05-26 13 views
1

ich innerhalb einer while-Schleife Daten von einer seriellen Schnittstelle bin wie folgt lautet:While-Schleife gibt

while((len = this.getIn().read(buffer)) > 0) { 
    data = new String(buffer, 0, len); 
    System.out.println("data len " + len); 
    handleModemresponse(data); 
} 

aber, während die Daten aus dem Strom beginnt zu lesen, das Hauptfenster AWT, unt Trennen der Schaltfläche, erhält keine Listener (das gesamte Fenster erhält keine Listener). Es hört nur ab, wenn die Übertragung abgeschlossen ist, d. H. Außerhalb der while-Schleife.

Ich möchte mein AWT-Fenster auf meine Aktionen hören, wenn es auch in der While-Schleife ist.

Irgendwelche Ideen, wie ich das erreichen kann?

Antwort

1

Ich vermute, dass Sie diese While-Schleife in einen separaten Thread schieben sollten, um Ihren AWT-Thread während der Übertragung nicht zu binden.

+0

@Pax: Sorry für die Formatierung, die Ihre Formatierung gelöscht;) Sie haben eine viel bessere Arbeit diese Frage auf Umformulierung. – VonC

+0

Keine Probs, @VonC, das passiert oft, hauptsächlich weil ich anale Reminiszenz daran habe, die Frage gut aussehen zu lassen, sobald ich mit der Bearbeitung beginne, und ich brauche zu lange. – paxdiablo

4

Es sieht so aus, als ob Sie alles in einem Thread haben - während Ihre Arbeitsmethode läuft, scheint Ihre GUI blockiert zu sein und reagiert auf keine Aktionen bis die Schleife endet.

Sie müssen Ihre GUI-Teilnahme in einem Thread und Ihre Arbeitsmethode in einem anderen trennen.

2

Die Lesemethode, die Sie anrufen, blockiert. Sie müssen es in einen anderen Thread verschieben, damit Ihre Zuhörer weiterarbeiten können.

+0

Um genauer zu sein, ist das Blockieren von I/O nicht das Problem hier. Es ist der langwierige Prozess im GUI-Thread, der das Problem verursacht. –

5

Erstellen Sie einen neuen Thread für die Leseaktion.

public class LongProcess implements Runnable { 
    public void startProcess() { 
    Thread t = new Thread(this); 
    t.start(); 
    } 

     public void run() { 
// Define inputstream here 
     while((len = inputStream.read(buffer)) > 0) { 
     data = new String(buffer, 0, len); 
     System.out.println("data len " + len); 
     handleModemresponse(data); 
     } 
     } 
    } 

EDIT (nach Kommentar Tom Hawtin - tackline):

SwingUtilities.invokeLater(new LongProcess()); 
+1

java.awt.EventQueue.invokeLater, um wieder in den AWT EDT-Thread zu gelangen. –

+0

er ... invokeLater ist zum notifizieren der GUI, wenn der Thread beendet ist: schließlich in run() etwas tun. ... ies.invokeLater (neu Runnable() { ... public void run() { gui.taskIsDone (Ergebnis); .... – KarlP