PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java/Swing]idle-Methode?


Gast
2007-07-23, 22:42:43
Hi Leute,

ich möchte gerne in einem Swing-Programm eine idle-Methode realisieren, d.h. eine Methode die immer wieder ausgeführt wird, wobei zwischen jeder Ausführung der Event Loop durchlaufen wird. In Delphi und .NET gibt es dafür z.B. die Methoden TApplication.OnIdle bzw Application.Idle, oder man programmiert eine Schleife in der TApplication.ProcessMessages/Application.DoEvents() aufgerufen wird. In SWT würde das vermutlich über eine Methode der Klasse Display gehen. Aber wie macht man das unter Swing?

Bisher habe ich mir dadurch beholfen, daß ich einen Nebenthread aufmache und die Methode dort in einer Schleife fortwährend aufrufe, und nach jedem Durchlauf mittels SwingUtilities.invokeAndWait() die Anzeige des Ergebnisses inm Hauptthread angestoßen wird.
Ist das unter Swing womöglich die einzige Lösung?

mithrandir
2007-07-25, 14:33:36
Ich denke nicht, dass es dafür eine fertige Lösung gibt. Du könntest immer wieder das gleiche Runnable-Objekt per invokeLater selbst in die EventQueue stellen - es würde dann eben abgearbeitet, wenn alle vorigen Events dran waren. In der run-Methode kannst du es dann einfach rekursiv wieder per invokeLater reinstellen (bzw. nach einem festgelegten Timeout?). Das käme schon in etwa hin, oder?

Monger
2007-07-25, 19:36:42
Verstehe ich das richtig, dass du benachrichtigt werden möchtest wenn die AWT Event Queue leer ist?

mithrandir
2007-07-26, 12:01:24
Ich hab's so verstanden, dass er immer dann etwas ausführen möchte, wenn gerade keine Events in der Queue sind (also ja, wenn sie leer ist, also idle ; - ) Hast du da eine bessere Idee?

Gast
2007-07-26, 12:05:38
die Lösung mit dem runnable, das sich rekursiv über invokeLater immer wieder selbst aufruft, scheint so weit zu funktionieren :)

@Monger: ja, so ungefährt. Die SWT-Lösung sähe wohl so aus:
while (!display.isDisposed())
{
// Event Queue abfragen
if(!display.readAndDispatch())
{
// wenn leer, idle-Methode ausführen
doIdleMethod();
}
}

Monger
2007-07-26, 12:27:03
Ich hab's so verstanden, dass er immer dann etwas ausführen möchte, wenn gerade keine Events in der Queue sind (also ja, wenn sie leer ist, also idle ; - ) Hast du da eine bessere Idee?

Leider nicht. Ich hatte gehofft, dass die AWT Event queue vielleicht irgendwo ihre Größe verrät. Dann hätte man sich als Listener eintragen lassen können (bzw. die Listener Methode eines Fensters überschreiben können), und jedes mal wenn ein Event reinkommt nach der Größe der Queue fragen können.

Ist aber leider nicht so. Die AWT Event queue erbt nicht etwa von einer Queue, wie man vielleicht erwarten könnte.