Swing MVC-Threading

V

vanny

Gast
Hi,

nur mal so in den Raum gefragt, ist es evtl. sinnvoll, "M", "V" und "C" von vornherein als seperate Threads zu starten?(wobei die View ja eh im EDT läuft);

Wenn "nein", warum nicht?

Gruß Vanny
 
V

vanny

Gast
Ist das Glas nun halb voll oder halb leer? .... ich beantworte die Gegenfrage mal trozdem;)

Naja, zBsp. könnte der Controller gleich mal die Sitzungzeit stoppen, die Uhrzeit an die Viewschicken, man könnte die "längeren" Prozesse (zBsp. DB-Abfrage) im Controller ausführen ohne dort immer nen neuen Thread zu starten und nach Beendigung halt die View informieren.

Macht sicherlich nur Sinn, wenn man einen Zentralen Controller hat aber ich fände das schon praktisch.
Mit dem Model ists mir auch schleierhaft warum xD aber hätte ja vielleicht auch noch eine Idee hier kommen können.

Gruß Vanny
 
Zuletzt bearbeitet von einem Moderator:

Michael...

Top Contributor
Naja, zBsp. könnte der Controller gleich mal die Sitzungzeit stoppen, die Uhrzeit an die Viewschicken, man könnte die "längeren" Prozesse (zBsp. DB-Abfrage) im Controller ausführen ohne dort immer nen neuen Thread zu starten und nach Beendigung halt die View informieren.
Dann müsstest Du aber alle Zugriffe des Controllers auf die View synchronisieren.
 
V

vanny

Gast
Dann müsstest Du aber alle Zugriffe des Controllers auf die View synchronisieren.

Warum?
Wenn ich der View sage, zeichne mal folgendes neu, dann zeichnet sie folgendes neu o0.
Ich muss natürlich sicherstellen, dass die Daten entsprechend vorbereitet sind, da hat doch aber die View nix mit zu tun. Oder steh ich da jetzt auf dem Schlauch?
 
G

Gast2

Gast
Warum?
Wenn ich der View sage, zeichne mal folgendes neu, dann zeichnet sie folgendes neu o0.
Ich muss natürlich sicherstellen, dass die Daten entsprechend vorbereitet sind, da hat doch aber die View nix mit zu tun. Oder steh ich da jetzt auf dem Schlauch?

Klar musst du dann synchroniseren. Wenn dein Controller in einem anderen Thread arbeitet und du von dem aus sagst he zeichne dich mal neu, musstdu sicherstellen dass die View in dem richtigen (UI)Thread neugezeichnet wird.
 
V

vanny

Gast
aso ja ok mit invokeLater oder SwingWorker ... das hatte ich unter dem Sysncronisieren so jetzt nicht verstanden :p

ich dachte da jetzt an syncronized o.ä.

aber das steht dem eigentlichen Thema ja nun nicht zwingend entgegen.

Gruß Vanny
 

Michael...

Top Contributor
Mal angenommen der Controller läuft in einem separaten Thread (was auch immer das heißen mag) und die View im EDT:
Wie bekommst Du die Events aus der View an den Controller in dessen Thread?
Aktionen aus der View auch wenn sie im Controller ausgeführt werden laufen im EDT.
 
G

Gast2

Gast
aso ja ok mit invokeLater oder SwingWorker ... das hatte ich unter dem Sysncronisieren so jetzt nicht verstanden :p

ich dachte da jetzt an syncronized o.ä.

aber das steht dem eigentlichen Thema ja nun nicht zwingend entgegen.

Es gibt auch andere UI Toolkits...
Aber ich sehe bis jetzt keinen Vorteil, nur Aufwand das ganze syncron zu halten...
 
V

vanny

Gast
Naja, ich hatte ein wenig im netz geforscht, und dieses Thema halt in einigen englischen Forendiskusionen ohne wirkliche Ansätze einer Klärung des Problems gelesen.

Ich fand die Idee recht interressant, und wollte mich erkundigen.
Mit den neuen Infos, ist es wohl wenig sinnvoll, danke für eure Hilfe.

Gruß Vanny
 
Zuletzt bearbeitet von einem Moderator:

Michael...

Top Contributor
Wenn man mehrere Threads hast die gemeinsame Schnittstellen besitzen hat man immer die Synchronisationproblematik. Daher finde ich es einfacher und sicherer Threads bedarfsgerecht und bewußt einzusetzen.
Solche "getrennten" Ansätz sind sicherlich möglich. Meiner Meinung aber viel zu komplex und fehleranfällig - eventuell gibt's da ja irgendwelche Frameworks die sowas unterstützen, ich kenne keine. (was nichts heißen muss ;-))
 

schalentier

Gesperrter Benutzer
Man kann das machen. Ein sinnvolles Hilfsmittel ist dabei ein Publish-Subscribe-Pattern mit einem EventDispatcher. D.h. deine Anwendung feuert Events, sobald sich an einer Stelle irgendwas geaendert hat (z.B. Button wurde gedrueckt, Berechung wurde beendet, etc), die von einem EventHandler "gefangen" und verarbeitet werden. Ein solcher Handler kann dabei in einem beliebigen Thread laufen.

Bisschen Pseudocode:
Java:
button.addActionListener( new ActionListener() {
   public void actionPerformed(..) {
      eventDispatcher.publishEvent( new StartCalculation() );
   }
});
edtHandler.handleEvent( RedrawGui.class, new Handler<RedrawGui>() {
   public void handle( StartCalculation calc ){
      // gui neu binden, das hier laeuft im EDT
   }
});
Java:
modelEventHandler.handleEvent( StartCalculation.class, new Handler<StartCalculation>() {
   public void handle( StartCalculation calc ){
      // hier laeuft alles in einem extra Modelthread
      eventDispatcher.publishEvent( new RedrawGui() );
   }
});

Anmerkungen:
1) Entweder du schickst alle notwendigen Daten stets in den Events mit (bei grossen Datenmengen kaum machbar), oder du musst wenigstens Getter synchronisieren, damit ein thread-uebergreifender Zugriff z.B. auf das Modell moeglich ist.
2) Events koennen supereinfach ueber ein Netzwerk geschickt werden (mehr Threads, Netzwerkfaehigkeit, ...)
 

Ähnliche Java Themen


Oben