SWT Gui Thread hängt sich auf

cable545

Aktives Mitglied
Hallo,
hab mal wieder ein Problem mit Threads und einer SWT GUI. In Thread-A wird eine GUI dargestellt mit einem Textfeld. In einem Thread-B möchte ich aus dem Textfeld von der GUI aus Thread-A, lesen. Nun habe ich in der GUI Klasse dem display ein Runnable Objekt übergeben, um von
außen(ein anderer Thread) auf die GUI zugreifen zu können. Das sieht in etwa so aus.
Code:
display.asyncExec( Client.threadJob );
"threadJob" referenziert in einer Client Klasse in Thread-B mein Runnable Objekt.
Wenn ich das dann ausführe hängt sich jedoch meine GUI immer auf. Sie wird dargestellt, reagiert aber auf nichts mehr. Weder Buttons noch Eingabefelder lassen sich irgendwie manipulieren. Kann es sein, dass ich irgendwas mit dem asyncExec falsch verstanden hab?
 
Zuletzt bearbeitet:
Jop hast du wohl, bei async wird dein ganzes runnable im UI Thread ausgeführt. Du brauchst das async nur wenn du auf UI Elemente zugreifst...
 
Ah ok. ich hab jetzt in meinem Thread-B ein seperates Runnable Objekt erstellt. Und in der run Methode zu diesem Objekt wird halt nur aus dem Textfeld aus der Gui aus Thread-A gelesen. Das funktioniert so ganz gut. Nur ist mir noch nicht ganz klar wo genau der Unterschied zwischen den beiden Methoden syncExec() und asyncExec liegt. Ansonsten erstmal vielen Dank für die Hilfe.
 
Was genau ist denn die Frage. Hast du ein KSKB?
Warum benutzt du nicht einfach die Job Api
On the Job: The Eclipse 3.0 Jobs API

Sobald du ein runnable in sync oder async ausführst wird dieses mit dem ui thread synchronisiert und dort ausgeführt. Es gibt eine queue von runnable welche im ui thread sind und in dieser queue hängst du ein weiteres HINTEN hin.
d.h. wenn du async aufrufst hängst du ein runnable hinten hin und dein und dein code geht SOFORT weiter und das runnable wird ausgeführt sobald dein UI Thread Zeit dafür hat.
Wenn du sync aufrufst legst du wieder ein runnable in den UI Thread, ABER dein Code nicht geht weiter. Weil solange gewartet wird bis dein Runnable abgearbeitet ist.

D.h. nur wenn du auf UI Widgets zugreifst solltest du ein runnable da rein legen. Keine Long Task Runnable, die sollest du im Hintergrund machen.
 

Zurück
Oben