SWT: GUI -> Keine Rückmeldung

RipdEaTh

Mitglied
Hi Leute!

Ich bin immernoch an meinem Thread-Problem dabei.
Inzwischen hab ich das ganze als asyncThread laufen, klappt auch soweit.

Allerdings hängt sich der Zähler immernoch manchmal auf. Das scheint damit zusammenzuhängen, dass die GUI nicht reagiert.

Folgender Sachverhalt liegt vor:
Ich hab ein Main-Programm. In diesem wird ein neues Fenster (shell) geöffnet, worin sich der Counter befindet.

Das neue Fenster ist abhänging von dem Main-Fenster un das Main-Fenster wird deaktiviert, so dass man nicht zwischen beiden Fenstern hin und herspringen kann.
Nun kommt aber öfters das Problem, dass sich die GUI aufhängt (erkennbar daran, dass die Menüleiste aus dem Main-Fenster weiß wird).
Selbes Phänomen bekomme ich auch, wenn ich das Programm in den Hintergrund verlager (also z.B. Eclipse davor tue) und dann wieder in den Vordergrund hole.

Wenn die GUI nicht mehr reagiert, kann ich zwischen beiden Fenstern wieder hinundher springen.
Nun würde ich gerne wissen, ob mir da jemand helfen kann, das Problem einzugrenzen und vll damit dem eigentlichen Problem auf die Schliche zu kommen. Denn es kann doch nicht sein, dass die GUI nicht reagiert, wenn ein Thread läuft und die GUI eigentlich nichts mehr macht..

Vielen Dank für Eure Hilfe :)
 
Hast du Thread.start() oder Thread.run() benutzt? Du musst in jedem fall start() benutzen, sonst läuft es nicht als Thread. Das ist das was mir spontan einfallen würde.
 
Hi,

den Thread starten brauch man in dem Fall nicht.
Das sieht wie folgt aus:

Java:
display.asyncExec(new Runnable() {

	public void run() {

		// Instanziere einen weiteren Thread
		ThreadClass t = new ThreadClass(args);
		Thread x = new Thread(t);

		x.start();

		// Dann tu die GUI mit den Daten aus dem Thread aktualisieren

		while (!x.finish) {
			try {
				Thread.sleep(200);
			} catch (InterruptException ie) {
			} finally {
			refreshGUI(t.integerwert);
			}
		}
	}
}

Also daran wirds nicht liegen.. :confused:
 
Uhjee kein Wunder. In einem sync oder asyncExec soll nur minimaler Code stehen.

sync und async exec müssen nur benutzt werden wenn aus einem nicht GUI Thread auf ein SWT GUI Element zugegriffen werden soll. Da es nur den einen GUI Thread gibt sollte dieses Code Stück möglichst kurz sein, da der Rest der GUI so lange nicht aktualisiert werden kann wie dieser Code läuft (In deinem Beispiel so lange bis der inner Thread beendet ist).

Komplizierte Berechnungen etc also möglichst vorher durchführen und ein asyncExec wirklich nur zum aktualisieren der GUI Elemente verwenden.

Für dich heisst das also das asyncExec nur um refreshGUI(t.integerwert); herum zu haben und zwar innerhalb des Thread x bzw der ThreadClass t.

Hoffe das war einigermaßen verständlich.
 
Hi!

Genau so hatte ich das vorher geregelt.. Genau der selbe Effekt.. Daraufhin hab ich das ganze mal in diese async Geschichte gebastelt.. Also das hat wohl kaum was damit zu tun..

Sonst noch eine Idee?
 
So ist es auf jeden Fall falschrum.

Was tut denn ThreadClass und refreshGUI?

In jedem Fall ist diese while Schleife ein bisschen komisch. Diese läuft ja selbst nicht in nem Thread, also müsste sie dauerhaft ein Thread.sleep aufrufen. Da du sogar ausserhalb des x Thread bist und Thread.sleep den aktuell aktiven Thread schlafen legt, kann es passieren dass du damit den GUI Thread schlafen schickst.

Am besten mal ein wenig debug ausgaben einbauen, dann solltest du sehen was wann aufgerufen wird. Im Falle einer InterruptException die GUI zu aktualisieren ist vielleicht auch nicht so geschickt. Denn eigentlich willst du ja nur dass das alle 200ms passiert.

Würde empfehlen das Thread.sleep innerhalb des x Thread auszuführen und auch das refreshGUI in einem async exec gekapselt direkt dahinter auszuführen. Beides innerhalb einer while Schleife die wartet bis der Thread beendet wird. So mache ich das zumindest immer und habe auch keine Probleme gehabt, selbst wenn mehrere Threads liefen.
 
Zurück