![]() |
div,mod oder doch besser / ?
Hallo Leute,
ich steh gerade total auf dem Schlauch - wird wohl nicht mein Tag sein. Ich haben einen Timer am Laufen und möchte eigentlich aller 300 Sekunden ein paar Daten speichern. Nun könnte ich mit case checken, ob die Sekundenanzahl 300, 600 oder 900 (usw.) ist, aber das scheint mir doch etwas zu viel Code. Ehrlich gesagt, komm ich nicht drauf wie ich das lösen kann. Mir ist schon klar, dass die Anzahl der Sekunden dividiert durch 300 eine ganze ergeben müssen. Wie kann ich aber prüfen, ob das Ergebnis wirklich eine ganze Zahl ist? Vielleicht wenn Sekunden Mod 300 = 0 ist? Ich glaube, ich habe mir gerade selbst die Antwort gegeben... Das wird ganz sicher nicht mein Tag...:? |
AW: div,mod oder doch besser / ?
Warum stellst du den Intervall des Timers nicht einfach auf 300000?
|
AW: div,mod oder doch besser / ?
Ich würde genauso vorgehen. Wenn du das Intervall vom Timer auf 300 Sekunden stellst (also 300 * 1000), dann wird der (fast) immer aufgerufen und du musst dich nur im OnTimer-Event um dein Speichern der Daten kümmern.
Falls das dein Problem nicht löst, weil du etwas anders löst, musst du wohl etwas Code zeigen... |
AW: div,mod oder doch besser / ?
Zitat:
|
AW: div,mod oder doch besser / ?
Timerintervall müsste dazu aber genau 1 Sek. sein, sonst speichert man evtl. mehrfach in einer Sekunde. Dann gibt's aber das Problem, dass eventuell genau der Tick bei 300 Sekunden durch das eigene Programm oder irgend einen anderen Prozess leicht verspätet kommt, und schwupps ist der genaue "X mod 300 = 0" Punkt vorbei.
Die einzig saubere Variante ist ein Timer mit passendem Intervall von 300000ms, und immer speichern wenn der kommt. (Alternativ noch ein Thread mit 300000ms Sleep drin, aber das ist ggf. deutlich komplizierter nachher.) |
AW: div,mod oder doch besser / ?
Ich würde das Timerintervall sehr niedrig ansetzen, eine Variable FLastSaved mit GetTickCount o.ä. vergleichen, wenn nötig speichern und die Variable neu setzen.
|
AW: div,mod oder doch besser / ?
Wenn du es mit Timer sonst nicht so übertreibst, warum nicht einfach einen 300000er-Timer?
Also das du mit "div" nicht weit kommst, kannst'e dir wohl denken, oder? Du könntest/mütest dir den letzen Wert merken und warten bis sich das Ergebnis ändert. Und mit "/" erst recht (bei all den Threads bezüglich dem "Vergleichen" bei Fließkommazahlen :stupid: ) Wenn du gegen einen internen Zähler prüfst, welcher nur an einer Stelle, in diesem Timerereignis, geändert wird, dann kann man mit =0 arbeiten, wen man z.B. gegen die Unrzeit prüft, dann sieht das ganz anders aus, da ma dort nicht unbedingt genau diesen Moment treffen muß. Sowas kann man z.b. in einem Timer mit einem Intervall von 1 Sekunde bis 1 Minute (wenn "div y" wehr als eine Minute) ... je nach genauigkeit
Delphi-Quellcode:
Es hat sogar den Vorteil, daß es nicht vom Startzeitpunkt des timer abhängt. (5 Minuten können da ja auch 3, 8, 13, 18 usw. sein)
X := Trunc(TimeOf(Now) * MinsPerDay) div 5;
if X <> LastX then begin LastX := X; // mach was, zu jeder vollen 5. Minute (5, 10, 15, ...) end; // oder wenn man mehreres in Minutenintervallen prüfen will X := Trunc(TimeOf(Now) * MinsPerDay); if X div 5 <> LastX1 then begin LastX1 := X div 5; // mach was, zu jeder vollen 5. Minute (0, 5, 10, 15, ...) end; if X div 10 <> LastX2 then begin LastX2 := X div 10; // mach was, zu jeder vollen 10. Minute (0, 10, 20, 30, ...) end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz