Hallo,
ich habe mich nun etwas intensiver damit befasst eine "multithreadded" Anwendung in Java mit einem Swing GUI zu programmieren, stehe aber scheinbar vor einem (verständnis?)Problem.
Habe bis dato eher serielle Programme geschrieben weshalb das nie ein Problem wurde.
Was ich habe:
ich habe einen Tool geschrieben welches in der Lage ist GPX-Tracklogs zu verarbeiten und diverse Dinge in Kombination mit OSM-Daten anzustellen.
Es kommen also sowohl lokale Dateioperationen, als auch Datenstreams aus dem Internet zum Einsatz.
Soweit so gut.
Mein "Problem" ist nun folgendes:
Ich habe in meinem Programm eine Art Console realisiert die mit Hilfe von TextAreas zum einen Debuggen soll und zum anderen den User "führen" soll im sinne von "was macht das Programm gerade".
Das klappt soweit auch alles wunderbar, wäre da nicht der Punkt, dass die Console (aka die TextArea) so lange "hängt" bzw eingefroren ist, bis der gerade laufende Prozess abgeschlossen ist. Dann erscheinen plötzlich sämtliche ausgaben auf einmal statt one-by-one wenn sie eigendlich erscheinen sollten.
Mir ist klar, dass dies irgendwie damit zusammenhängen muss, dass die Swing-Komponente nicht asynchron zu dem derzeit aktiven Prozess zu laufen scheint, bzw Swing "wartet" biss der Prozess beendet ist.
Dabei habe ich schon diverse Dinge versucht wie z.B. nen SwingWorker, Thread, EventQueue, etc pp.
Alle funktionieren im sinne von "tun was sie sollen" haben aber bei mir stehts das "lock" Problem.
Daher vermute ich hier ein generelles Verständnisproblem meinerseits wie ich so eine Sache anzugehen habe.
Kann mir da von euch wer nen Simples how to aufzeigen?
PS:
Falls der Ablauf von Bedeutung ist, hier wie ich es bis jetzt mache:
1. Benutzer klickt im GUI, welches auch die TextArea enthält, auf "Parse GPX"
2. Daraufhin wird ein neuer SwingWorker gestartet, mit einer Referenz auf das TextArea Object
3. der Worker "tut etwas" und gibt diverse "Informationen" in Form von Strings aus die auf der TextArea geprintet werden sollen
Allerdings zeigt die TextArea die Strings immer erst an, sobald das Parsen (und somit der SwingWorker Task) abgeschlossen ist...
Und wie gesagt, an Stelle von SwingWorkern hab ichs auch schon mit "normalen" Threads versucht, allerdings hab ich in diversen Guides zu dem Thema gelesen, dass der SwingWorker the way to go ist, schon allein wegen der Thread-Sicherheitsproblematiken mit Swing.
Bin für jede Hilfe dankbar .
ich habe mich nun etwas intensiver damit befasst eine "multithreadded" Anwendung in Java mit einem Swing GUI zu programmieren, stehe aber scheinbar vor einem (verständnis?)Problem.
Habe bis dato eher serielle Programme geschrieben weshalb das nie ein Problem wurde.
Was ich habe:
ich habe einen Tool geschrieben welches in der Lage ist GPX-Tracklogs zu verarbeiten und diverse Dinge in Kombination mit OSM-Daten anzustellen.
Es kommen also sowohl lokale Dateioperationen, als auch Datenstreams aus dem Internet zum Einsatz.
Soweit so gut.
Mein "Problem" ist nun folgendes:
Ich habe in meinem Programm eine Art Console realisiert die mit Hilfe von TextAreas zum einen Debuggen soll und zum anderen den User "führen" soll im sinne von "was macht das Programm gerade".
Das klappt soweit auch alles wunderbar, wäre da nicht der Punkt, dass die Console (aka die TextArea) so lange "hängt" bzw eingefroren ist, bis der gerade laufende Prozess abgeschlossen ist. Dann erscheinen plötzlich sämtliche ausgaben auf einmal statt one-by-one wenn sie eigendlich erscheinen sollten.
Mir ist klar, dass dies irgendwie damit zusammenhängen muss, dass die Swing-Komponente nicht asynchron zu dem derzeit aktiven Prozess zu laufen scheint, bzw Swing "wartet" biss der Prozess beendet ist.
Dabei habe ich schon diverse Dinge versucht wie z.B. nen SwingWorker, Thread, EventQueue, etc pp.
Alle funktionieren im sinne von "tun was sie sollen" haben aber bei mir stehts das "lock" Problem.
Daher vermute ich hier ein generelles Verständnisproblem meinerseits wie ich so eine Sache anzugehen habe.
Kann mir da von euch wer nen Simples how to aufzeigen?
PS:
Falls der Ablauf von Bedeutung ist, hier wie ich es bis jetzt mache:
1. Benutzer klickt im GUI, welches auch die TextArea enthält, auf "Parse GPX"
2. Daraufhin wird ein neuer SwingWorker gestartet, mit einer Referenz auf das TextArea Object
3. der Worker "tut etwas" und gibt diverse "Informationen" in Form von Strings aus die auf der TextArea geprintet werden sollen
Allerdings zeigt die TextArea die Strings immer erst an, sobald das Parsen (und somit der SwingWorker Task) abgeschlossen ist...
Und wie gesagt, an Stelle von SwingWorkern hab ichs auch schon mit "normalen" Threads versucht, allerdings hab ich in diversen Guides zu dem Thema gelesen, dass der SwingWorker the way to go ist, schon allein wegen der Thread-Sicherheitsproblematiken mit Swing.
Bin für jede Hilfe dankbar .