# Timer oder Thread.sleep



## sabykos (5. Feb 2012)

Hallo zusammen,
ich arbeite gerade an einem Tower Defense Projekt. Hierbei nutze ich ich für die Darstellung der GUI Swing.

Geplant habe ich, dass vor jedem Level 15 Sekunden Zeit bleibt damit der Spieler sich auf die Welle vorbereiten kann. Diese 15 Sekunden sollen am Rand des Spielfeldes heruntergezählt werden. Zur Realisierung habe ich zwei Alternativen versucht.

1. Möglichkeit über Multithreadening. Ich habe eine innere Klasse geschrieben, die 15 mal eine Schleife ausführt und im Schleifenrumpf jeweils 1 Sek wartet und dann die Anzeige aktualisiert.
Nach dem startet den Threads habe ich versucht den Hauptthread auf den Thread warten zu lassen:


```
Task task = new Task();
		task.start();
		try {
			task.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
```
(Task ist hierbei innere Klasse die von Thread erbt.)

Durch Überprüfung über die Console weiß ich, dass mein Programm ganz genau das macht was es soll. Das Spiel läuft bis zum Ende fehlerfrei.
Das Problem ist nur: Das GUI-Fenster wird schwarz (Wahrscheinlich weil ich den Hauptthread über join gestoppt habe. Aber ich kann join nicht weglassen, sonst lauft der Hauptthread einfach weiter und das Level beginnt sofort.) Außerdem sind während die GUI schwarz ist natürlich Benutzereingaben unmöglich.

2. Möglicheit mit Timer. Ich habe die Warteprozedur von einem Timer ausführen zu lassen. Nachdem die 15 Sekunden herum sind stoppe ich mit t.stop();. Hierzu foldender Code:


```
Task task = new Task();
		t = new javax.swing.Timer(GP_TICK, task);
		t.setRepeats(true);
		t.start();
		try {
			wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
```
(Task ist hierbei eine innere Klasse die ActionListener implementiert.)
Die 15 Sekunden werden in der GUI heruntergezählt und der Zähler an der Seite aktualisiert wie ich es will. Jedoch bricht der Hauptthread bei wait() ab (Wahrscheinlich nutze ich es falsch). Das führt dazu, dass das Programm nach dem der Timer-Thread fertig ist abbricht.

Ich benötige nun also entweder eine Möglichkeit Multithreading zu betreiben ohne, dass die GUI abbricht oder eine Möglichkeit meinen Hauptthread sinnvoll mit meinem Timer zu synchronisieren.

Ich bedanke ich mich schonmal.

Viele Grüße

Sabine Koszig


----------



## pl4gu33 (5. Feb 2012)

Threads sind schon etwas her daher versuch ich das gerade wieder abzurufen soweit ich noch weiß 
musst du das so machen

while( Bedinung)  (in deinem Fall, dass der Timer noch nicht bei 0 ist)
    wait();


und dieses Wait() "weckst" du dann mit einem notifyAll() (oder auch notify()) wenn der Timer 0 ist ... dann wird die Bedinung wieder geprüft und wenn er abgelaufen ist wird weitergemacht.

Daher denke ich, dass das Programm einfach die ganze Zeit in wait() verweilt, weil du deinen Thread nicht weckst.

(ich hoffe das war so richtig erklärt )


----------



## sabykos (5. Feb 2012)

Vielen Dank erstmal für deinen Vorschlag!

Ich habe das getestet. Damit das mit wait() und notify() klappt muss die Methode in der das wait steht zusatzlich synchronized sein. Wenn man das alles hinzugefügt hat erzeugt wait immerhin keine Exception mehr, jedoch ist nun auch hier das GUI-Fenster schwarz.

Meiner Minung nach liegt das Problem darin, dass ich egal ob ich mit Thread und join oder mit Timer und wait arbeite immer der EventDispatcherThread blockiere (Deshalb wird die GUI schwarz und Benutzereingaben werden nicht mehr registriert). Ich muss es irgendwie schaffen, dass die weitere Programmausführung (Level starten usw.) auf das Ende des Timers wartet ohne dass dabei der EventDispatcher Thread blockiert wird.

Noch jemand ne Idee?


----------



## GUI-Programmer (5. Feb 2012)

Ja, hab noch ne Idee:
Benutz doch SwingWorker. Der ist imho genau dafür gemacht. Darin kannst du dann Thread.sleep verwenden oder einen javax.swing.Timer ausführen.


----------

