# "Wecker" programmieren



## jesus_heiland (17. Apr 2006)

hallo zusammen
ich möchte mir einen kleinen desktop kalender programmieren, dazu brauche ich eine funktion, die irgendetwas tut ( fenster öffnen, sound abspielen ... was auch immer), wenn ein bestimmtes datum und zeitpunkt erreciht ist. die möglichkeit alle x sekunden die systemzeit abzufragen und zu vergleichen ist nicht sonderlich elegant, daher wollte ich mal fragen ob irgendwer eine möglichkeit kennt, wie man den event auslösen könnte.


----------



## Illuvatar (17. Apr 2006)

Ich kenne sonst keine Möglichkeit. Aber wenn du das, sagen wir, einmal pro Sekunde machst, ist das zumindest für die CPU ja keine weitere Belastung. "Schön" ist es vielleicht nicht, aber wenns sonst nix gibt...


----------



## jesus_heiland (18. Apr 2006)

eben auf diese weise funktionierts schon. und nach einem ersten testdurchlauf scheints die cpu wirklich nicht allzu arg in mitleidenschaft zu ziehen. nur kann ich mir nicht vorstellen, dass es für diesen fall keinen listener observer oder was auch immer geben soll...


----------



## L-ectron-X (18. Apr 2006)

Du kannst auch einmal die Differenz zum nächsten Event bestimmen und den Thread dann so lange pausieren lassen.
Wenn ein weiteres Event in die Liste eingefügt wird, muss wieder die Differenz bis zum nächsten Ereignis bestimmt werden. usw.
So gehst du ganz sicher, dass die CPU nicht unnötig beschäftigt wird.


----------



## Murray (18. Apr 2006)

Sieh Dir mal java.util.Timer an.


----------



## Leroy42 (18. Apr 2006)

Warum ziehst du nicht einfach einen Timer auf?

Der macht im Hintergrund wahrscheinlich auch nichts anderes, aber _sieht_ zumindest eleganter aus.


----------



## Illuvatar (18. Apr 2006)

L-ectron-X hat gesagt.:
			
		

> Du kannst auch einmal die Differenz zum nächsten Event bestimmen und den Thread dann so lange pausieren lassen.
> Wenn ein weiteres Event in die Liste eingefügt wird, muss wieder die Differenz bis zum nächsten Ereignis bestimmt werden. usw.
> So gehst du ganz sicher, dass die CPU nicht unnötig beschäftigt wird.



Das Problem ist dabei nur vielleicht, dass Thread.sleep äußerst ungenau arbeitet.


----------



## Leroy42 (18. Apr 2006)

Illuvatar hat gesagt.:
			
		

> ...dass Thread.sleep äußerst ungenau arbeitet.


Was heißt ungenau? In welcher Größenordnung?
Ich kann mir nicht vorstellen, daß die Ungenauigkeit mehr als ein paar Sekunden betragen _kann_;
das hängt natürlich von der Implementierung der Methode ab.

Und auch wenn, für einen _Wecker_ sollte die Genauigkeit doch allemal reichen!?


----------



## Murray (18. Apr 2006)

Leroy42 hat gesagt.:
			
		

> Illuvatar hat gesagt.:
> 
> 
> 
> ...



Man darf halt nicht zulassen, dass sich eventuelle Ungenauigkeiten kumulieren, so in der Form:

```
int sek = 0;
int min = 0;
int std = 0;

while ( true) {
  Thread.sleep( 1000);
   sek++;
  if ( sek >= 60) {
     min++;
     sek = 0;
     if ( min >= 60) {
       std++;
       min = 0;
     }
  }
}
```

So eine Uhr würde wohl tatsächlich nicht besonders genau gehen; man darf sleep() nur verwenden, um in mehr oder weniger regelmässigen Abständen z.B. per System.currentTimeMillis() die dann jeweils aktuelle Zeit abzufragen.

Aber diese Schwierigkeiten kapselt java.util.Timer ja ganz gut.


----------



## jesus_heiland (18. Apr 2006)

danke vielmals für die antworten. ich denke die idee von murray mit java.util.timer scheint genau das zu sein, wonach ich suche. falls jemand einen kleinen desktopkalender braucht, nur melden dem projekt scheint ja jetzt nichts mehr im weg zu stehen ;-)


----------

