Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   div,mod oder doch besser / ? (https://www.delphipraxis.net/171503-div-mod-oder-doch-besser.html)

torud 9. Nov 2012 07:44

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...:?

Morphie 9. Nov 2012 07:47

AW: div,mod oder doch besser / ?
 
Warum stellst du den Intervall des Timers nicht einfach auf 300000?

Codewalker 9. Nov 2012 07:48

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...

angos 9. Nov 2012 07:56

AW: div,mod oder doch besser / ?
 
Zitat:

Zitat von torud (Beitrag 1190456)
[...]Ich glaube, ich habe mir gerade selbst die Antwort gegeben...[...]

Jap, das hast du! Mit mod kannst du diese Prüfung gut machen :)

Medium 9. Nov 2012 08:33

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.)

Bummi 9. Nov 2012 08:42

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.

himitsu 9. Nov 2012 10:04

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:
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;
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)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz