2 Threads nacheinander. Einer terminiert, der andere nicht.

Status
Nicht offen für weitere Antworten.

Ralf1007

Mitglied
Hallo.

Schaut euch bitte folgende zwei Methoden an:

Code:
protected void onCreate(eHomeBase newObject) {

		Display.getDefault().syncExec(new Runnable() {

			@Override
			public void run() {
				refreshChildren();
			}
			
		});
}

protected void onDelete(Object model) {

		Display.getDefault().syncExec(new Runnable() {

			@Override
			public void run() {
				refreshChildren();
			}
			
		});
	}

Im Programmablauf ergibt es sich, dass diese beiden Methoden nacheinander aufgerufen werden. Zuerst onCreate, weil etwas erstellt wurde, dann nach kurzer Zeit onDelete, weil ein anderer Vorgang bewirkt hat, dass etwas gelöscht wurde.
In beiden Methoden wird ein Thread geöffnet, der nach meiner Interpretation dann beendet ist, wenn refreshChildren() abgearbeitet wurde. Die Abläufe darin sind recht komplex und über mehrere Ebenen verteilt, weshalb ein posten dieser Methode keinen Sinn macht.
Ausgangssituation steht.

Nun gibt es beim Aufruf von onCreate kein Problem. Der Thread wird gestartet und ordnungsgemäß beendet. Das ist wenigstens das, was ich glaube ;) Beim Aufruf von onDelete wird der Thread gestartet, terminiert aber nicht, sodass das komplette Programm bis in alle Ewigkeit (also bis ich das Programm per Taskmanager oder rotem Eclipse-Knopf schliesse) hängt. Ich könnte mir das so erklären, dass refreshChildren nicht terminiert. Das ist aber ohne die Ausführung in einem eigenen Thread nicht der Fall.

Der Grund, weshalb ich diesen Weg der Ausführung wähle, ist, dass ich in bestimmten Fällen eine SWTException wegen Invalid Thread Access bekomme. Irgendwie muss ich diese in den Griff bekommen und das erscheint mir als die richtige Variante.

Hat jemand von euch eine Idee, weshalb der zweite Thread offensichtlich nicht terminiert? Muss ich vielleicht etwas mit dem Display machen, damit das so funktioniert?

Ich bedanke mich bei jedem, der sich die Mühe macht mir zu helfen.

MfG,

Ralf
 

Wildcard

Top Contributor
Wenn du wirklich einen Thread öffnen würdest, dann würdest du eine InvalidThreadException bekommen, weil nur der SWT Thread die Widgets verändern darf (wie bei Swing auch).
Das tust du aber nicht, weshalb man mit dem Rest deiner Aussagen nichts mehr anfangen kann.
 

Ralf1007

Mitglied
Ich nutze GEF. Was GEF innen drin tut oder unterlässt, entzieht sich leider meiner Kenntnis. Offensichtlich aber wird ein neuer Thread geöffnet, der nicht der SWT UI Thread ist, denn sonst würde ich diesen Fehler nicht bekommen. Die passende Fehlermeldung ist dann eine "org.eclipse.swt.SWTException: Invalid thread access ". Dieser nicht-SWT-UI-Thread ruft dann die o.g. Methoden auf und verursacht die Exception.

Versuche ich das Problem wie oben beschrieben zu lösen, passiert das nicht mehr, dafür terminiert der zweite in onDelete geöffnete Runnable nicht.

Besser kann ich es leider nicht erklären. Wenn das nicht reicht, muss ich anders klarkommen.

Gruß,

Ralf
 

Wildcard

Top Contributor
Nein, was du über Display#(a)syncExec startest wird in den Dispatch Thread verschoben, es wird kein neuer Thread gestartet.
Sollte tatsächlich wie du sagst das 'Runnable terminieren', dann würde das bedeuten das dein GUI Thread terminiert, denn dort wird es ausgeführt.
 

Wildcard

Top Contributor
Ralf1007 hat gesagt.:
Ich nutze GEF. Was GEF innen drin tut oder unterlässt, entzieht sich leider meiner Kenntnis. Offensichtlich aber wird ein neuer Thread geöffnet, der nicht der SWT UI Thread ist, denn sonst würde ich diesen Fehler nicht bekommen. Die passende Fehlermeldung ist dann eine "org.eclipse.swt.SWTException: Invalid thread access ". Dieser nicht-SWT-UI-Thread ruft dann die o.g. Methoden auf und verursacht die Exception.
Im übrigen weiß ich das eine oder andere über GEF, es wird also für uns beide leichter wenn du weniger Vermutungen anstellst und dafür mehr ins Detail gehst. (Nicht böse gemeint, ich bin da lediglich pragmatisch :wink: )
 

Ralf1007

Mitglied
Okay. Das ist doch ein Ansatzpunkt.

Wenn ich im betreffenden Fall vor und hinter das Display#syncExec ein sysout mache, wird das dahinter nicht mehr ausgegeben. Das sagt mir, dass diese Codezeile nicht mehr erreicht wird. Zudem hängt das Programm.

Also bleibt er dann im GUI-Thread hängen oder wie muss ich das verstehen?

Mir fehlt, glaube ich nur dieser eine gedankliche Schritt. Den Rest kann ich mir dann selber zusammenbasteln, wie ich hoffe.

Danke für deine Hilfe.

Ralf

EDIT: Würde ich die Doku mit offenen Augen lesen, hätte ich gewusst, dass kein neuer Thread gestartet wird. Mein Fehler.
 

Wildcard

Top Contributor
onDelete und onCreate sind vermutlich die Methoden die aufgerufen wird wenn sich am Model etwas ändert (in deinem EditPart vermutlich?)?
Sagen wir das onCreate Event wird von einem non-ui Thread getriggert (sollte eigentlich schonmal nicht, der erste Fehler ist also womöglich schon dort).
Nun willst du refreshChildren aufrufen, was natürlich im UI Thread ausgeführt werden muss. Mit syncExec blockst du den Thread bis der UI Thread zurückkehrt.
Beim refreshChildren wird nun eine Änderung festgestellt die (womöglich über 3 Ecken) onDelete triggert, diesmal jedoch aus dem UI Thread.
Wieder ein syncExec und diesmal lässt du den UI Thread auf sich selbst warten und hast somit einen Deadlock.
Das sind alles nur Vermutungen, weil ich zu wenige Details kenne, aber eine mögliche Erklärung.
Auf syncExec solltest du wo immer möglich verzichten, lieber asyncExec.
Höchstwahrscheinlich aber solltest du dir überlegen ob das event wirklich von einem non-ui Thread getriggert werden sollte, oder ob nicht dort schon das asyncExec hingehört.
 

Ralf1007

Mitglied
Wow, danke. Das klingt alles sehr schlüssig und deine Vermutungen treffen zu, soweit ich das einzuschätzen vermag. Ich werde jetzt erstmal schlafen gehen, mir deinen Gedankengang morgen früh aber nochmal zu Gemüte führen. Ich denke, dass du mich damit aber auf den Lösungsweg gebracht hast. Danke dafür, ich melde mich dann nochmal.

Gute Nacht!
 

Ralf1007

Mitglied
Ich habe versprochen mich nochmal zu melden :)

Nach ausführlicher Lektüre des Artikels
http://book.javanb.com/swt-the-standard-widget-toolkit/ch05lev1sec7.html
war alles klar. Oben beschriebenes Problem wird erstens dadurch behoben, dass ich asyncExec nutze. Zum Zweiten muss ich das GUI-Update vom Thread, in dem ich mich befinde, abhängig machen. Nämlich ganz normal, wenn ich mich im GUI-Thread befinde und mit asyncExec, falls das nicht der Fall ist.

Ich empfehle auf jeden Fall den Artikel zu lesen bei solchen Problemen. Der macht die Chose durchsichtig :)

Danke an Wildcard für den Schubs in die richtige Richtung.

MfG,

Ralf
 

Wildcard

Top Contributor
Ralf1007 hat gesagt.:
Zum Zweiten muss ich das GUI-Update vom Thread, in dem ich mich befinde, abhängig machen. Nämlich ganz normal, wenn ich mich im GUI-Thread befinde und mit asyncExec, falls das nicht der Fall ist.
Hmm, jein. In den meisten Fällen ist es sinnvoller die model-änderung selbst über asyncExec durchzuführen, damit keiner der Listener jemals mit einem anderen Thread in Berührung kommt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Threads nacheinander aufführen AWT, Swing, JavaFX & SWT 5
frager2345 Threads -> Ereignisbehandlung AWT, Swing, JavaFX & SWT 2
N jFrame löscht am Ende des Threads alles AWT, Swing, JavaFX & SWT 2
J GUI Ausgaben aus Threads AWT, Swing, JavaFX & SWT 13
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
N JavaFX Logging des JavaFX Application Threads mit Log4J AWT, Swing, JavaFX & SWT 3
U JAVAFX observer und threads AWT, Swing, JavaFX & SWT 1
J Textlabel verändern mit parallelen Threads AWT, Swing, JavaFX & SWT 7
Sugan Inhalte mit Threads ändern -> java.lang.IllegalStateException AWT, Swing, JavaFX & SWT 6
R Straßenkreuzung - Ampeln mit Threads koordinieren AWT, Swing, JavaFX & SWT 5
C Threads Swing AWT, Swing, JavaFX & SWT 11
Z JavaFX Threads AWT, Swing, JavaFX & SWT 4
T hallo, habe ein Problem mit dem pro. eines Threads AWT, Swing, JavaFX & SWT 4
M Threads - nicht erklärbare Exception AWT, Swing, JavaFX & SWT 6
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
S Java Swing GUI mit MVC und Threads AWT, Swing, JavaFX & SWT 6
M Frage zu Threads AWT, Swing, JavaFX & SWT 3
C JTextArea scrollt bei append(String) aus Threads nicht ans Ende AWT, Swing, JavaFX & SWT 7
K Threads - Timer - run() mehrfach parallel? AWT, Swing, JavaFX & SWT 2
B GUI mit Threads aufbauen AWT, Swing, JavaFX & SWT 5
E Threads Ausgaben in GUI anzeigen lassen AWT, Swing, JavaFX & SWT 14
P JavaFX 2 (2.1 Beta) Threads AWT, Swing, JavaFX & SWT 7
B Threads in Swing AWT, Swing, JavaFX & SWT 4
M Problem mit Threads AWT, Swing, JavaFX & SWT 64
R Swing Java Swing Gui und nebenläufige Threads AWT, Swing, JavaFX & SWT 4
S Swing Threads Windows 7 64 bit AWT, Swing, JavaFX & SWT 12
J Threads + JFrame AWT, Swing, JavaFX & SWT 4
R Java threads und synchronized AWT, Swing, JavaFX & SWT 15
R Swing Swing und die Threads AWT, Swing, JavaFX & SWT 9
N Swing Threads sollen Tabtitel zur Laufzeit ändern AWT, Swing, JavaFX & SWT 4
S Gui und Aufgaben Threads AWT, Swing, JavaFX & SWT 12
M Zugriff paralleler Threads auf selbes JTextPane AWT, Swing, JavaFX & SWT 6
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
M Prioritäten bei SwingWorker / Threads AWT, Swing, JavaFX & SWT 9
B Swing GUI und Threads AWT, Swing, JavaFX & SWT 4
R Korrektes manipulieren der GUI aus anderen Threads heraus AWT, Swing, JavaFX & SWT 19
S Threads und Layout AWT, Swing, JavaFX & SWT 9
S Threads in einen Frame zeichnen lassen (Paint()?!) AWT, Swing, JavaFX & SWT 5
W GUI in mehreren Threads AWT, Swing, JavaFX & SWT 5
F Swing Anfängerproblem Threads AWT, Swing, JavaFX & SWT 6
S Swing Threads und das Ändern des Hintergrundes ... AWT, Swing, JavaFX & SWT 2
S Zeichnen in Threads AWT, Swing, JavaFX & SWT 4
T Auf Ende von mehreren Threads warten, ohne den EDT zu blockieren AWT, Swing, JavaFX & SWT 1
J SWT SWT und Threads AWT, Swing, JavaFX & SWT 5
borobudur SWT SWT-Framework und Threads AWT, Swing, JavaFX & SWT 12
A Swing und Threads AWT, Swing, JavaFX & SWT 8
B JProgressbar wird nicht aktualisert, trotz Threads AWT, Swing, JavaFX & SWT 6
K Timer und Threads ruckeln für Fotoschwenk AWT, Swing, JavaFX & SWT 3
S JProgressBar und Threads AWT, Swing, JavaFX & SWT 11
G Probleme mit jList und Threads. AWT, Swing, JavaFX & SWT 3
R Swing & Threads AWT, Swing, JavaFX & SWT 4
J Unterschied zwischen SwingWorker und Threads AWT, Swing, JavaFX & SWT 4
P Threads und Swing bzw. AWT AWT, Swing, JavaFX & SWT 15
W Threads und trotzdem keine Nebenläufigkeit AWT, Swing, JavaFX & SWT 13
G Fenster erst nach Stoppen des Threads anzeigen AWT, Swing, JavaFX & SWT 3
N Threads kein neues Fenster erzeugen lassen AWT, Swing, JavaFX & SWT 4
G problem mit threads/repaint ! AWT, Swing, JavaFX & SWT 2
W Swing, 2 JProgressbars und threads geht das? AWT, Swing, JavaFX & SWT 2
A JTextArea und Threads AWT, Swing, JavaFX & SWT 9
B Probleme mit GUI und Threads AWT, Swing, JavaFX & SWT 17
E repaint(), EDT-Warteschlange und Threads AWT, Swing, JavaFX & SWT 26
S Threads in Java AWT, Swing, JavaFX & SWT 22
G AWT + Threads = nicht gut :P AWT, Swing, JavaFX & SWT 6
F Verständis Problem zu Threads AWT, Swing, JavaFX & SWT 2
M Swinganwendung Threads mit JProgressBar AWT, Swing, JavaFX & SWT 7
V Problem mit Aktualisieren von JList mit Threads AWT, Swing, JavaFX & SWT 3
U FileChooser Layout - Threads? AWT, Swing, JavaFX & SWT 17
R JProgressBar ohne Threads verwenden AWT, Swing, JavaFX & SWT 6
I JList, AbstractListModel und nebenläufige Threads AWT, Swing, JavaFX & SWT 2
S "Millionen" von Threads? Programm komplett beenden AWT, Swing, JavaFX & SWT 2
M Konsolenprg-Ausgabe in GUI geleitet - Brauche ich Threads? AWT, Swing, JavaFX & SWT 2
K Swing und Threads AWT, Swing, JavaFX & SWT 11
M Threads in Swing? AWT, Swing, JavaFX & SWT 2
C Schweres Problem mit JDialog und Threads! Anzeige blockiert! AWT, Swing, JavaFX & SWT 5
N Netzwerk-Applikation, SWT und Threads AWT, Swing, JavaFX & SWT 4
R createBufferStrategy() und Threads AWT, Swing, JavaFX & SWT 5
D Threads unter JFrame AWT, Swing, JavaFX & SWT 2
G Nochmal Threads und Einfrieren des GUI :( AWT, Swing, JavaFX & SWT 10
V Swing & Threads ??? AWT, Swing, JavaFX & SWT 3
D Problem mit JProgressBar und Threads AWT, Swing, JavaFX & SWT 7
J BufferedImages nacheinander als Video anzeigen AWT, Swing, JavaFX & SWT 14
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
Jackii 2 Frames nacheinander aufrufen AWT, Swing, JavaFX & SWT 6
N Mehrere Tasks nacheinander ausführen AWT, Swing, JavaFX & SWT 7
M 2D-Grafik Mehrere Linien (nacheinander) übereinander Zeichnen AWT, Swing, JavaFX & SWT 6
M Mehrere JPanel nacheinander?! AWT, Swing, JavaFX & SWT 11
K Bilder nacheinander einfügen AWT, Swing, JavaFX & SWT 3
C zwei Bilder nacheinander anzeigen AWT, Swing, JavaFX & SWT 2
A 1 JFrame und 3 Panel Nacheinander anzeigenlassen über Button AWT, Swing, JavaFX & SWT 5
G Wie Bilder nacheinander anstatt aufeinmal rastern? AWT, Swing, JavaFX & SWT 6
Z Mehrere Oberflächen nacheinander? AWT, Swing, JavaFX & SWT 3
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben