Hallo,
mein Programm soll eine Swing-Oberfläche haben über die der User mittels Aktionen in Menüs, Buttons, Listen usw. Befehle übers Netzwerk verschicken kann.
Die Sache ist jetzt die, dass ich zwar Multithreading insofern benutzen möchte dass das GUI nicht blockiert, d.h. die ganze Netzwerkgeschichte nicht im EDT möchte. Andererseits ist das Netzwerkprotokol synchron und ich muß daher verhindern das Befehl2 verschickt wird bevor die Antwort auf Befehl1 da ist.
Dazu sehe ich zwei Möglichkeiten.
1. Die GUI während wartens auf Antwort so zu beschränken (z.B. Elemente disablen) dass währenddessen nichts ausgelöst werden kann.
2. Alle Befehle die ausgelöst werden, landen in einer Queue und werden nacheinander ausgeführt.
Momentan (mit Disziplin bei der Bedienung) wird für jeden Befehl ein SwingWorker kreiert und in dessen doInBackground() ausgeführt, die Antwort wird im done() der GUI bekanntgegeben. Aber SwingWorker schert sich halt nicht um o.g. Beschränkung und der User könnte mehrere gleichzeitig auf den Weg bringen.
Jetzt meine Fragen: Gibt es noch weitere Konzepte um zu erreichen was ich möchte? Wie löst ihr sowas?
Momentan gefällt mir obige Idee 2 besser als die erste. SwingWorkers Verhalten lässt sich leider nicht modifizieren (getWorkersExecutorService() ist private). Kennt ihr ähnliche Klassen die sich modifizieren lassen oder schon das gewünschte Verhalten aufweisen?
Übersehe ich etwas?
Jürgen
mein Programm soll eine Swing-Oberfläche haben über die der User mittels Aktionen in Menüs, Buttons, Listen usw. Befehle übers Netzwerk verschicken kann.
Die Sache ist jetzt die, dass ich zwar Multithreading insofern benutzen möchte dass das GUI nicht blockiert, d.h. die ganze Netzwerkgeschichte nicht im EDT möchte. Andererseits ist das Netzwerkprotokol synchron und ich muß daher verhindern das Befehl2 verschickt wird bevor die Antwort auf Befehl1 da ist.
Dazu sehe ich zwei Möglichkeiten.
1. Die GUI während wartens auf Antwort so zu beschränken (z.B. Elemente disablen) dass währenddessen nichts ausgelöst werden kann.
2. Alle Befehle die ausgelöst werden, landen in einer Queue und werden nacheinander ausgeführt.
Momentan (mit Disziplin bei der Bedienung) wird für jeden Befehl ein SwingWorker kreiert und in dessen doInBackground() ausgeführt, die Antwort wird im done() der GUI bekanntgegeben. Aber SwingWorker schert sich halt nicht um o.g. Beschränkung und der User könnte mehrere gleichzeitig auf den Weg bringen.
Jetzt meine Fragen: Gibt es noch weitere Konzepte um zu erreichen was ich möchte? Wie löst ihr sowas?
Momentan gefällt mir obige Idee 2 besser als die erste. SwingWorkers Verhalten lässt sich leider nicht modifizieren (getWorkersExecutorService() ist private). Kennt ihr ähnliche Klassen die sich modifizieren lassen oder schon das gewünschte Verhalten aufweisen?
Übersehe ich etwas?
Jürgen