2010-12-09 8 views
1

Ich habe eine (in erster Linie) Single-Thread-Anwendung, die eine Swing-Chart-Komponente (jfreechart) aktualisiert, wie es geht.Pause für den Event Dispatcher

Da alle Aktualisierungen des Diagramms auf dem Ereignis-Dispatching-Thread ausgeführt werden, wird die Menge der Tasks zu groß und das Diagramm wird nicht rechtzeitig mit dem Code aktualisiert, der es aktualisiert.

Gibt es eine Möglichkeit, so oft anzuhalten, dass der Event-Dispatching-Thread aufholen kann?

Meine erste Neigung wäre, eine Dummy-Aufgabe über SwingUtilities.invokeAndWait zu que ... könnte es so einfach sein?

prost, p.

+0

ja das scheint zu funktionieren, hat jemand eine aufgeräumtere Methode? – pstanton

Antwort

2

Die Dummy-Aufgabe würde funktionieren, aber vielleicht könnten Sie darüber nachdenken, einige Aktualisierungen im Daten erzeugenden Thread zu überspringen.

Es hängt davon ab, was genau Sie tun. Ist es Ihr Ziel, etwas so schnell wie möglich zu berechnen und die GUI auf dem Weg zu aktualisieren, oder versuchen Sie, eine nette GUI zu erstellen, die eine Datenanalyse demonstriert?

Wenn es ersteres ist, dann wollen Sie nicht wirklich warten, bis die GUI aktualisiert wird - es wird nur Ihre Berechnungen verlangsamen. In diesem Fall überspringe einfach einige Updates und vereinige sie zu weniger häufigen, größeren Updates.

Wenn es das letztere ist, wird invokeAndWait wahrscheinlich den Trick tun.

+0

Ich verwende wieder Code, der für einen weniger intensiven Prozess entwickelt wurde, und das Ziel besteht nur darin, die Echtzeitinformationen zu visualisieren, wenn sie schneller als in Echtzeit zurückgelesen werden. es muss nicht sehr schnell sein, aber ich möchte, dass der Prozess und die ED miteinander Schritt halten. sieht so aus wie invokeAndWait. Ich werde sehen, ob jemand mit etwas besser kommt, oder ich gebe dir einen Tick an einem Tag oder 2. Prost. – pstanton

+0

Sie könnten alle Ihre Aktualisierungen immer in einem 'invokeAndwait' durchführen - dann können Sie Ihren Lese-Thread garantieren und der EDT wird in lock-step ausgeführt. Repaints können jedoch immer noch verschmolzen werden. –

+0

Sie haben recht, aber das würde bedeuten, dass ich den geteilten Code ändern müsste (was ich nicht tun möchte), und er würde viel langsamer laufen als die einzelne "invokeAndWait" bei (viel weniger) Schlüsselpunkten im Prozess . – pstanton

1

Ein Ansatz besteht darin, die Aktualisierungsraten zu entkoppeln: Aktualisieren Sie das Datenmodell asynchron und aktualisieren Sie die Ansicht mit einer niedrigeren, einstellbaren Rate. Dieses example verwendet javax.swing.Timer, um periodische Aktualisierungen durchzuführen, aber ein festes Verhältnis ist eine Alternative. Im Fall von JFreeChart sollte die fireSeriesChanged() Methode von DynamicTimeSeriesCollection Ihnen die notwendige Kontrolle geben.

Verwandte Themen