# Timer Problem



## javaneuling (8. Februar 2008)

Hallo

Ich sehe es wieder einmal gar nicht und probiere schon einige Zeit herum.

Ich erstelle einen Timer

java.util.Timer timer=new java.util.Timer();

Wenn ich ihn starte, soll es nach 5 Sekunden pipsen:

public class Task extends TimerTask{

  @Override
   public void run(){
   Toolkit.getDefaultToolkit().beep();
   }
}

Mit dem folgenden Befehl starte ich den Timer:

timer.schedule(new Task(),5000);

Das funktioniert auch. Wenn der Benutzer aber eine Taste drückt, bevor die 5 Sekunden vorbei sind, soll es nicht pipsen.

public void keypressed...

Hier möchte ich nun timer.cancel(); aufrufen, aber das geht nicht. Ich erhalte "Timer already cancelled".

Wie kann man das lösen? Scheint so simpel zu sein und geht doch nicht.

Danke

JavaNeuling


----------



## Stigma (8. Februar 2008)

Schreibe eine Methode die sich für 5sec schlafen legt. Nachdem diese 5sec vorbei sind wird der beep ausgegeben.


----------



## Matze (8. Februar 2008)

javaneuling hat gesagt.:


> public void run(){
> Toolkit.getDefaultToolkit().beep();
> }


Deine Methode gibt gleich nach dem Starten den Beep aus. Davor gehöhrt noch ein Thread.sleep(5000L);

Ich hoffe ich habe dein Anliegen richtig verstanden.

Verwende das nächste mal die Code Tags


----------



## MeinerEiner_80 (8. Februar 2008)

Moin!


> Deine Methode gibt gleich nach dem Starten den Beep aus. Davor gehöhrt noch ein Thread.sleep(5000L);



Nö, dafür ist ja der Timer zuständig, der das ganze erst nach 5 Sekunden aufruft.



javaneuling hat gesagt.:


> Hier möchte ich nun timer.cancel(); aufrufen, aber das geht nicht. Ich erhalte "Timer already cancelled".


Der Aufruf funktioniert schon. Die cancel() Methode kannst du sooft aufrufen wie du willst.
Ich nehme aber an, du rufst die cancel() Methode auf und möchtest danach mit dem Timer erneut einen Task erstellen. Das klappt nicht.
Entweder erstellt du dir dann einen neuen Timer oder du cancelst den TimerTask und nicht den Timer...

*grüssle*
MeinerEiner


----------



## javaneuling (8. Februar 2008)

Danke für die rasche Antwort. Aber so simpel geht es nicht. Denn dann schläft das Programm 5 Sekunden lang und reagiert nicht auf den Tastendruck.
Javaneuling


----------



## Matze (8. Februar 2008)

Sicher dass die cancle() - Methode was bringt? Da in run() keine Schleife, kein gar nichts ist, läuft doch sowieso nix oder?


----------



## Matze (8. Februar 2008)

javaneuling hat gesagt.:


> reagiert nicht auf den Tastendruck.



Ich dachte das sollte es!?

Wofür nutzt du den Timer eigentlich?

Wenn du etwas ausführen möchtest und dabei auf Tastatuereignisse reagiern möchtest solltest du dir mal Threads anschauen.


----------



## Stigma (8. Februar 2008)

Erzeug doch einen zusätzlichen Thread und überschreibe nicht die standard run Methode. Dieser Thread läuft parallel zum Programm und kann es auch nicht ausbremsen.


----------



## javaneuling (8. Februar 2008)

Matze from HwI hat gesagt.:


> Deine Methode gibt gleich nach dem Starten den Beep aus. Davor gehöhrt noch ein Thread.sleep(5000L);
> 
> Ich hoffe ich habe dein Anliegen richtig verstanden.
> 
> Verwende das nächste mal die Code Tags



Nein, meine Methode gibt den Pips nach 5 Sekunden. Das funktioniert schon. Was nicht funktioniert, ist das Abbrechen innerhalb von 5 Sekunden.


----------



## MeinerEiner_80 (8. Februar 2008)

Es geht hier nicht um Threads sondern um TimerTask, welche von einem Timer gestartet werden.  Von daher würde ich gerne nochmal auf meinem vorherigen Post hinweisen, der wohl total untergegangen ist und bevor der arme javaneuling total verunsichert wird...


----------



## javaneuling (8. Februar 2008)

Matze from HwI hat gesagt.:


> Ich dachte das sollte es!?
> 
> Wofür nutzt du den Timer eigentlich?
> 
> Wenn du etwas ausführen möchtest und dabei auf Tastatuereignisse reagiern möchtest solltest du dir mal Threads anschauen.



Ich brauche den Timer, damit der Pips nicht sofort erfolgt, sondern erst nach 5 Sekunden.


----------



## Stigma (8. Februar 2008)

Dann lass Ihn doch jede 10nano prüfen ob eine Taste gedrückt wurde!
nach jeder 10nano erhöt er einen Zähler und wenn der Zähler 5000 erreicht ist schluss.
Sollte bol taste = true sein dann bricht er ab und taste wird von einer Eingabe gesetzt.

Ist schmutzig die Idee allerdings funktioniert es erst ein mal.


PS:
Ich halt mich raus. Das Thema liegt mir nicht so.


----------



## javaneuling (8. Februar 2008)

MeinerEiner_80 hat gesagt.:


> Moin!
> 
> 
> Nö, dafür ist ja der Timer zuständig, der das ganze erst nach 5 Sekunden aufruft.
> ...



Natürlich soll das Ganze mehrmals aufgerufen werden, aber darum geht es nicht. Ich kann die TimerTask auch bei einem einmaligen Aufruf nicht abbrechen, d.h. verhindern, dass es pipst.


----------



## MeinerEiner_80 (8. Februar 2008)

Dann poste doch mal bitte den (lauffähigen) Quellcode, welches diesen Fehler verursacht..


----------



## javaneuling (8. Februar 2008)

MeinerEiner_80 hat gesagt.:


> Dann poste doch mal bitte den (lauffähigen) Quellcode, welches diesen Fehler verursacht..



Mehr Code kann ich nicht liefern. Die exakte Fehlermeldung lautet:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Timer already cancelled.


----------



## MeinerEiner_80 (8. Februar 2008)

Dann kann ich dir leider auch nicht weiter helfen. 
Ich kann dir nur sagen, das so eine Fehlermeldung eigentlich nur kommt, wenn man versucht erneut einen TimerTask von einem bereits gecancellten Timer ausführen lassen möchte..


----------



## javaneuling (11. Februar 2008)

Aus einem Programm, das Tausende von Programmzeilen enthält und mit einer Ausnahme perfekt läuft, die relevanten Zeilen herauszupicken, ist nicht so einfach.

Ja nu, wie dem auch sei, ich habe das Problem ohne Timer gelöst:

long startCountTime;
long idleCountTime;

startCountTime = Calendar.getInstance().getTimeInMillis();

notYetSignal = true;

while (notYetSignal == true) {
   idleCountTime = Calendar.getInstance().getTimeInMillis();
   if (idleCountTime - startCountTime > 5000) {
      Toolkit.getDefaultToolkit().beep();
      notYetSignal = false;
   }
}

Dort, wo ich die Tastatureingaben abfrage, setze ich notYetSignal auf false. Damit habe ich erreicht, was ich möchte: es pipst nach 5 Sekunden. Wenn der Benutzer eine Taste drückt, bevor die 5 Sekunden vorbei sind, pipst es nicht.

Ich denke zwar, das Gleiche müsste sich via Timer auch erreichen lassen. Wie das gehen soll, ist mir nach wie vor nicht klar.

Ich danke allen herzlich für die lebhafte Diskussion.

JavaNeuling


----------

