Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#25

AW: Programm Wurzelberechnung nach Heron

  Alt 18. Jan 2017, 21:21
Bei den römischen Zahlen gibt es keine 0, kann von daher auch nicht ausgegeben werden

Was ich mit der Intervallberechnung bezwecken möchte, mal ein Beispiel:

Das Programm wird um 21:36:45,567 gestartet und soll zu jeder vollen Sekunde ein Timerereignis ausführen.

Wir benötigen hier also die Anzahl der Millisekunden zwischen

21:37:00,000
und
21:36:45,567

Das wäre das Timerintervall, das gesetzt werden müsste.

Klar, bei so einer Aufgabe, wie der Ausgabe der Uhrzeit, ist die Laufzeit so kurz, dass eine Neuberechnung absurd erscheint.
Wenn Du Deine Uhr aber mal über einen längeren Zeitraum laufen lässt, wirst Du bemerken, dass die Zahl der Millisekunden langsam, aber kontinuierlich, ansteigt.
Bei meinem Rechner zwischen 2 und 3 Millisekunden pro Minute, das sind am Tag irgendwas zwischen 2880 und 4320 Millisekunden.

Auf's Jahr gerechnet werden daraus zwischen 1051200 und 1576800 Millisekunden, gibt also sowas um die 20 Sekunden. Hier wäre es schön, wenn die Uhr diesen Fehler selbst korrigieren könnte. Dazu muss halt ab und an das Timerintervall etwas kürzer als 1000 Millisekunden sein. So, wie es auf meinem Rechner aussieht, zwei bis dreimal pro Minute.

Hier mal ein paar Fragmente aus 'ner von TTimer abgeleiteten Komponente von mir:
Delphi-Quellcode:
const
  iOneSecond : Integer = 1000; // eine Sekunde in Millisekunden
  iFiveSeconds : Integer = 5000; // fünf Sekunden in Millisekunden
  iFifteenSeconds : Integer = 15000; // fünfzehn Sekunden in Millisekunden
  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

function TSpecialTimer.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.
  Result := (Result mod Max(iTimerInterval,1));
end;
Der Aufruf könnte dann z. B. so erfolgen:
Delphi-Quellcode:
// Damit der Timer zur nächsten vollen Sekunde ausgelöst wird:
Timer1.Interval := CalcTimerInterval(iOneSecond);
// Zur nächsten vollen Viertelstunde, um den Glockenschlag für die Viertelstunde auszulösen:
Timer2.Interval := CalcTimerInterval(iFifteenMinutes);
// Oder um Mitternacht, z. B. für den Datumswechsel:
Timer3.Interval := CalcTimerInterval(iOneDay);
  Mit Zitat antworten Zitat