Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#13

Re: Immer wiederkehrende Aufgaben realisieren

  Alt 29. Jul 2008, 16:47
Zitat von RWarnecke:
Startet die TTimer - Komponente den Interval neu, wenn ich Sie deaktiviere und dann wieder aktiviere ? Ich bin bis jetzt zumindest davon ausgegangen.
Ja, dadurch kommen immer "Zeitverschiebungen" zustande, die sich im Laufe der Zeit spürbar summieren.
Wie brauchst Du denn den Timer: Immer zur vollen Stunde oder immer zur vollen Minute oder immer nach Abschluß eines Vorganges eine bestimmte Zeitdifferenz.
  • Interval := 60000;

    Timer ein

    Timerereignis
    Timer aus
    irgendwas arbeiten lassen
    Timer ein
Das zweite Timerereignis wird also eine Minute nach dem Abarbeiten des ersten Timerereignisses ausgelöst und nicht zur vollen nächsten Minute.

Eventuell kommst Du ja damit an Deinem Problem "vorbei":

Ein paar Konstanten für definierte Zeiträume
Delphi-Quellcode:
const
  iOneMinute : Integer = 60000; // eine Minute in Millisekunden
  iFiveMinutes : Integer = 300000; // Fünf Minuten in Millisekunden
  iFifteenMinutes : Integer = 900000; // Fünfzehn Minuten in Millisekunden
  iOneHour : Integer = 3600000; // Eine Stunde in Millisekunden
  iOneDay : Integer = 86400000; // Ein Tag in Millisekunden
Eine Funktion zum Berechnen der Zeitdifferenz bis zum nächsten Timerereignis.
Hier wird der Wert berechnet, der Interval zuzuweisen ist, bevor der Timer eingeschaltet wird.
iTimerInterval ist einer der obigen Konstanten Werte.

Delphi-Quellcode:
function CalcTimerInterval(iTimerInterval : Integer) : Integer;
Var
          dNow : Double;
begin
  // Interval setzen
  // Tagesdatum und Uhrzeit holen
  dNow := Now;
  // Den Tagesanteil holen (= Nachkommastellen).
  dNow := dNow - Trunc(dNow);
  // Rest bis Mitternacht holen.
  dNow := 1 - dNow;
  // Nachkommastellen mal Millisekunden pro Tag
  Result := Trunc(dNow * iOneDay);
  // wir benötigen den Rest bis zum angegeben Interval, damit der Timer
  // zur nächsten Minute, Stunde, 0 Uhr ... aktive wird.
  // (Der durchschnittliche Rechenfehler liegt bei 500 Millisekunden.)
  Result := (Result mod iTimerInterval);
end;
Habe einige Routinen zum Systemmonitoring, bei denen ich diese Berechnung einsetze. Die Routinen "schlagen" zur vollen Stunde, um Mitternacht, alle vollen fünf Minuten... zu. Die Abweichung durch das Berechnen ist immer kleiner 1 Sekunde. Damit kann ich für meinen Bedarf leben.

Stephan
  Mit Zitat antworten Zitat