Entwickler-Ecke

Sonstiges (Delphi) - Muss man die Zeit z.B. für einen Wecker pollen?


Aurum - Mo 16.03.09 20:05
Titel: Muss man die Zeit z.B. für einen Wecker pollen?
Hallo Leute

Wenn ich einen Wecker mache der z.B. um 07:50 Uhr Alarm gibt, wie muss ich dies machen?

Muss ich einen TTimer verwenden der jede Sekunde prüft ob es jetzt 07:50 ist und wenn es zutrift dann schlage ich Alarm?

Oder gibt es eine elegantere Lösung?


Gruss

Aurum


Yogu - Mo 16.03.09 20:09

Du könntest die Differenz zwischen der aktuellen Zeit und der gewünschten Weckzeit berechnen und diese dem Timer zuweisen. Da der aber sehr ungenau arbeitet, würde ich erst etwas von der Zeit abziehen, und im Timer-Event noch so lange warten, bis auch wirklich der Wecker klingeln soll. (ggf. einfach den Intervall des Timers auf 1000 setzen).


Reinhard Kern - Mo 16.03.09 22:28

user profile iconAurum hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Leute

Wenn ich einen Wecker mache der z.B. um 07:50 Uhr Alarm gibt, wie muss ich dies machen?

Muss ich einen TTimer verwenden der jede Sekunde prüft ob es jetzt 07:50 ist und wenn es zutrift dann schlage ich Alarm?

Oder gibt es eine elegantere Lösung?


Gruss

Aurum


Hi,

du kannst den Scheduler des Betriebssystems beauftragen (linux cron, Windows at), aber der macht ja auch nichts anderes. Ausserdem, wie schon vorgeschlagen, kannst du ein längeres Intervall nehmen, wenn der Zeitpunkt noch entfernt ist, aber ein Event/Sekunde fällt kaum ins Gewicht, daher lohnt sich das nicht wirklich. Wenn du mit einem Abfrageintervall von 1 bis 10 Sekunden hinkommst, würde ich es beim Polling belassen.

Gruss Reinhard


JayEff - Mo 16.03.09 22:29

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Du könntest die Differenz zwischen der aktuellen Zeit und der gewünschten Weckzeit berechnen und diese dem Timer zuweisen. Da der aber sehr ungenau arbeitet
Meines wissens arbeitet der nur bei der kleinen Intervallen ungenau, jaenicke hat glaube ich den Test gemacht und ist auf Ungenauigkeit ab 15 ms abwärts gekommen.
Eine Möglichkeit steht in den FAQ...: http://www.delphi-library.de/viewtopic.php?t=23225&highlight=delay

Was genau das tut, steht im Beitrag, ob's besser ist als ein Timer ... :nixweiss:


Aurum - Mo 16.03.09 23:18

Danke für eure Tipps. Ich werde weiterhin alle Sekunde pollen.

Gruss

Aurum


Delete - Di 17.03.09 09:42

user profile iconAurum hat folgendes geschrieben Zum zitierten Posting springen:
Danke für eure Tipps. Ich werde weiterhin alle Sekunde pollen.

Gruss

Aurum


Wenn nur HH:MM interessieren, macht es keinen Sinn, jede Sekunde zu pollen, es reicht dann, 1x/Minute die Zeit zu vergleichen.


Yogu - Di 17.03.09 18:08

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconAurum hat folgendes geschrieben Zum zitierten Posting springen:
Danke für eure Tipps. Ich werde weiterhin alle Sekunde pollen.

Gruss

Aurum


Wenn nur HH:MM interessieren, macht es keinen Sinn, jede Sekunde zu pollen, es reicht dann, 1x/Minute die Zeit zu vergleichen.

Es macht in sofern Sinn, dass der User vielleicht auf die Sekunde genau um diese Uhrzeit geweckt werden will. Ich denke, ein normaler "Aufsteh"-Wecker (;)) macht am PC wenig Sinn, also wird es wohl eher etwas anderes sein. Und da kommt es manchmal schon auf die Sekunde an.

Deshalb mein Tipp: Etwa eine Minute vorher das Intervall hinuntersetzten. Dass ist gesichert, dass die Genauigkeit stimmt.


sky21 - Mi 18.03.09 09:31

Man kann die Invervallzeit auch dynamisch verändern.


Yogu - Mi 18.03.09 19:29

user profile iconsky21 hat folgendes geschrieben Zum zitierten Posting springen:
Man kann die Invervallzeit auch dynamisch verändern.

Und wo liegt jetzt genau der Unterschied? :gruebel:


ffgorcky - Mi 18.03.09 22:11

Also wenn es wirklich nur darum geht, möglichst wenige Timer-Abfragen für die Behandlung _eines_ konkreten Termins zu nutzen, dann könnte man ja errechnen, wie lange es noch bis zu dem Termin dauert und davon die Hälfte als Timer-Intervall angeben.
Dafür müsste man aber bei jeder Timer-Abfrage diese Errechnung wieder neu durchführen.

Oder man könnte ja auch direkt den MS-Abstand zum Termin berechnen mit dem, wie es in Thema
[Link="2 Fragen (Datum, Ereignis das immer auftrit)" URL=http://www.delphi-forum.de/viewtopic.php?t=72893&start=0&postorder=asc&highlight=tageszeit]
gemacht wird, und den Wert als Timer-Intervall angeben.


Boldar - Mi 18.03.09 23:52

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
Also wenn es wirklich nur darum geht, möglichst wenige Timer-Abfragen für die Behandlung _eines_ konkreten Termins zu nutzen, dann könnte man ja errechnen, wie lange es noch bis zu dem Termin dauert und davon die Hälfte als Timer-Intervall angeben.
Dafür müsste man aber bei jeder Timer-Abfrage diese Errechnung wieder neu durchführen.


Dann würde das ereignis aber nie eintreten^^


alzaimar - Do 19.03.09 08:38


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Procedure TWeckerForm.WeckerOnTimer (Sender : TObject);
Begin
  Wecker.Enabled := False
  If Now>WeckZeit Then // Aufsteeeehen!
    BimmelDiBimm
  Else Begin
// Interval auf Weckzeit-Jetzt-EineSekunde setzen (oder 1 Sekunde, wenn es gleich soweit ist)
    Wecker.Interval := Max(Trunc (((WeckZeit-Now)*86400-1)*1000),1000);
// Timer wieder anschalten
    Wecker.Enabled := True;
  End
End;

Vorsicht, mit diesem Wecker kann man nicht mehr als 25 Tage lang schlafen! :P