Swing Warten, bis eine GUI-Komponente aktualisiert ist?

icarus2

Top Contributor
Ahoi!

Ich habe für meine Maturaarbeit das N Damen Problem behandelt.

Ich habe folgendes Problem:
In meinen Problem werden die Konfigurationen gezeichnet und als Text ausgegeben in einem JTextArea. Das Problem ist nun, dass in der JTextArea der Text nicht schnell genug aktualisiert ist. Ich habe den Algo so implementiert, dass man ihn in verschiedenen Geschwindigkeiten ablaufen lassen kann.
Bei langsamem Ablaufen geht alles perfekt. Gibt man dem Rechner aber weniger als 8 Millisekunden in der sleep()-Methode, so wird der Text in der JTextArea falsch ausgegeben. (Ich weiss wiso es ist, aber das tut nicht wirklich viel zur Sache).

Da ich den Algo möglichst schnell ablaufen lassen möchte, will ich ihm nicht einfach sicherheitshalber 10 Millisekunden geben, weil er dadurch sehr langsam wird.

Gibt es Möglichkeiten auf die GUI-Aktualisierung zu warten? Wäre eventuell EventQueue.invokeAndWait(...) was?
 
Wäre eventuell EventQueue.invokeAndWait(...) was?
Ja, genau das ist es 😉 Wobei dann halt dein Programm nicht wirklich in der angegebenen Geschwindigkeit läuft. zB bei 3ms ist zwar das sleep nur 3ms, aber du könntest auch noch 10ms auf den EDT warten.

Alernativ updatest du bei steigender Geschwindigkeit des Programms die TextArea weniger oft, sodass die Queue nicht überfüllt wird. zB bei 5ms schickst du ein Textarea-Update nur alle 10 Durchläufe raus. Man darf halt nie vergessen dass der EDT ein Programm verlangsamt. Wenn du zB beim Laden eines Bildes bei jedem Byte eine ProgressBar updatest, dauert das Laden (scheinbar) 10 Sekunden. Aber das liegt nicht am Bild, sondern an den hunderttausenden Aufträgen in der EDT Queue.
 
Zuletzt bearbeitet:
Oki, alles klar =)

Ich habe früher mal versucht invokeAndWait(..) zu verwenden, wurden aber immer Exceptions geworfen und so weiter ^^ Ich geh jetzt ersma aus, werde mir das morgen aber mal genau anschauen. Ich muss mich sowiso mal genauer in das Thema einarbeiten.

Hat jemand vielleicht einen Online-Tip, bei dem alles sehr gut und detailliert erklärt wird? Im Handbuch der Java-Programmierung steht da nicht wirklich was drin soweit ich weiss.
 
Über den EDT:
Swing threading and the event-dispatch thread - JavaWorld

Und nochmal um mich klarer auszudrücken: Du updatest einfach zu oft. Du sagst ab 8ms kriegst du Probleme, rechnen wir das nach. Sagen wir mal deine Berechung an sich braucht keine Zeit, also 0ms, dann hast du bei 8ms sleeptime 125 Schleifendurchgänge in deinem Loop. Wenn du jedes mal die TextArea updatest, sind das 125 Aufträge pro Sekunde. Selbst wenn er alle 125 in einer Sekunde abarbeitet, hast du 125 mal ein Update auf der GUI. Dein Monitor wird aber nicht mehr als 60-75 Hz haben, das heisst etwa die Hälfte aller Updates wird gar nicht dargestellt werden können.
Außerdem kann ein Mensch bei nicht-interaktiven Programmen (er schaut also nur zu was angezeigt wird) ab 25 Bildenr pro Sekunde keinen Unterschied mehr erkennen.*

Summa summarum: Achte einfach drauf, dass du deine Textarea nicht öfters als 25 mal pro Sekunde updatest, dann wird dein Programm auch bei 1ms nicht so langsam, dass der EDT deinen Thread ausbremsen kann. Und ein inokeAndWait solltest du dir dann auch sparen können.

* Bei Games ist das etwas anderes, da merkt man auch noch den Unterschied zwischen 80 und 100 fps, aber das hat etwas mit der Erwartungshaltung auf eine Reaktion nach einer Aktion zu tun, oder anders gesagt: Wenn ich nach links drücke, muss sich etwas auf dem Schirm nach links bewegen. Da stoppt das Gehirn schon ab dem Zeitpunkt, wo du überhaupt erst daran denkst, die Taste zu drücken, und es "meckert" schon nach wenigen Millisekunden Verzögerung, denn Nervengeschwindigkeit ist SEHR schnell. Jeder kennt zB das Phänomen dass die erste Sekunde wenn man auf die Uhr schaut langsamer zu vergehen scheint als alle weiteren. Genau daher kommt das. Trifft aber auch nur auf schnelle Spiele zu, bestes Bsp ist Counter-Strike. Jeder spielt das mit 100fps, mit 60fps hast du einen riesen Nachteil bei dem Spiel.
 
Zuletzt bearbeitet:
Habe den Artikel gelesen, der ist super, vielen Dank dafür =)

Das Problem ist, dass der Algorithmus hat möglichst schnell laufen sollte. Deswegen muss ich die GUI so schnell updaten. Ich kann das Konzept jetzt nicht mehr ändern, aber ich habe etwas gebastelt und jetzt schauts recht gut aus.

Das mit dem Games wusste ich nicht. Hätte nicht gedacht, dass man so schnell reagiert ^^


Vielen Dank
 

Neue Themen


Zurück
Oben