ElapsedMilliseconds() - Problem mit zu lang laufendem System

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

ElapsedMilliseconds() - Problem mit zu lang laufendem System

Beitrag von Programie »

Hi,

Ich habe mir letztens ein kleines Tool für meinen Windows Server programmiert, welches mir die Laufzeit des Servers in Monate, Tage, Stunden, Minuten und Sekunden anzeigen soll. Doch dabei gibt es ein Problem.
Und zwar lese ich die Laufzeit mit ElapsedMilliseconds() aus. Letztens (etwa 23 Tage Laufzeit) hat es noch richtig funktioniert. Doch heute habe ich wieder geschaut, wie lange der Server schon läuft und bekam eine negative Zahl. :mrgreen:
Dann habe ich das ganze mal etwas verändert und habe mir zusätzlich noch die Anzahl der Sekunden ausgeben lassen.
Und dann war das Problem klar: Die Sekundenzahl war negativ.

Hier der Beweis:
Bild

Ist schon jemand anderem dieses Problem bekannt und weiß vielleicht wie man es umgehen kann?
BildBildBildBild
Marvin
Beiträge: 497
Registriert: 17.07.2005 14:42
Wohnort: Krikkit

Re: ElapsedMilliseconds() - Problem mit zu lang laufendem System

Beitrag von Marvin »

Es kann gar nicht anders sein, da ElapsedMilliseconds einen Long zurückgibt, der maximal 0x7FFFFFFF darstellen kann, dies entspricht 24 Tagen, 20 Stunden, 31 Minuten, 23 Sekunden und 647 Millisekunden. Danach wird die Zahl unweigerlich negativ. Du kannst versuchen, einen Quad daraus zu machen (eltime.q = ElapsedMilliseconds & $FFFFFFFF), aber das würde die Zeit auch nur verdoppeln. Ich weiß nicht, ob Windows intern einen 64-Bit-Zähler hat, wenn ja, dann könnte (bzw. müsste) es eine API-Funktion geben, um das auszulesen (wobei ich dir da nicht helfen kann), wenn nicht, dann gibt es keine Möglichkeit, das zu umgehen.

EDIT: Jap, ein paar Sekunden Google haben mich zu der Wikipediaseite zu GetTickCount geführt (http://en.wikipedia.org/wiki/GetTickCount) und da wird eine Funktion namens GetTickCount64 beschrieben, die wohl einen Quad zurückgibt. :allright:
Leider gibt es diese Funktion erst ab Windows Vista bzw. Windows Server 2008. :(
Siehe dazu: http://msdn.microsoft.com/en-us/library ... S.85).aspx
Zuletzt geändert von Marvin am 26.10.2009 18:12, insgesamt 2-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ElapsedMilliseconds() - Problem mit zu lang laufendem System

Beitrag von Kiffi »

Programie hat geschrieben:Ist schon jemand anderem dieses Problem bekannt und weiß vielleicht wie man es umgehen kann?
für die Anzeige der Serverlaufzeit würde ich die Date-Funktionen nehmen und nicht ElapsedMilliseconds.

Grüße ... Kiffi
a²+b²=mc²
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: ElapsedMilliseconds() - Problem mit zu lang laufendem System

Beitrag von Kaeru Gaman »

Kiffi hat geschrieben:für die Anzeige der Serverlaufzeit würde ich die Date-Funktionen nehmen und nicht ElapsedMilliseconds.
Yup, definitiv!

... zu ElapsedMilliseconds():
buffer den Wert der letzten Iteration und vergleiche ihn mit dem Aktuellen.
im Falle eines Overflows kannst du manuell einen High-Counter mitzählen.

Allerdings kenne ich das Problem eher in Bezug darauf, dass man die Differenz prüft für FrameTiming,
da muss man auch das Vorzeichen beachten um nicht zu Freezen wenn der Rechner 24Tage läuft.
Mitzählen wie oft ein Overflow stattfindet ist da weniger nötig.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Re: ElapsedMilliseconds() - Problem mit zu lang laufendem System

Beitrag von Programie »

Kiffi hat geschrieben:für die Anzeige der Serverlaufzeit würde ich die Date-Funktionen nehmen und nicht ElapsedMilliseconds.
Meinst du die aktuelle Zeit - Startzeit?
BildBildBildBild
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ElapsedMilliseconds() - Problem mit zu lang laufendem System

Beitrag von Kiffi »

Programie hat geschrieben:Meinst du die aktuelle Zeit - Startzeit?
jap, eigentlich meinte ich das.

Allerdings habe ich jetzt erst gelesen, dass Du die Serverlaufzeit darstellen
willst und nicht die Programmlaufzeit. :oops:

Wenn Du Deine App mit dem Server startest, so ist beim nächsten Booten die
Zeit weitestgehend identisch. Bei einem laufenden System ist das allerdings
keine Lösung.

Grüße ... Kiffi
a²+b²=mc²
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: ElapsedMilliseconds() - Problem mit zu lang laufendem System

Beitrag von Kaeru Gaman »

hm....
man könnte beim Start der App die ElapsedMilliseconds() mit Date() abgleichen,
damit kann mit die tatsächliche Serverstartzeit im Date()-Format ermitteln.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ElapsedMilliseconds() - Problem mit zu lang laufendem System

Beitrag von Kiffi »

Kaeru Gaman hat geschrieben:man könnte beim Start der App die ElapsedMilliseconds() mit Date() abgleichen,
ja, aber ElapsedMilliseconds ist ab einer Serverlaufzeit von ca. 24 Tagen bereits übergelaufen (siehe auch Posting von Marvin).

Grüße ... Kiffi
a²+b²=mc²
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: ElapsedMilliseconds() - Problem mit zu lang laufendem System

Beitrag von Kaeru Gaman »

ich denke die App startet mit dem server? o_O
also wenn die App nicht über 24 tage nach dem server startet, kann sie das ja so checken.

man kann auch ne mini-autostart-app auf den Server packen, der die Startzeit des Servers im Date() Format in die Registry packt und alles ist Wölkchen.
da kann dann jede App immer wieder nachgucken, wann der Server hochgefahren wurde.
davon ab, gibts dafür nicht startup-logs auf servern?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ElapsedMilliseconds() - Problem mit zu lang laufendem System

Beitrag von Kiffi »

Kaeru Gaman hat geschrieben:man kann auch ne mini-autostart-app auf den Server packen, der die Startzeit des Servers im Date() Format in die Registry packt und alles ist Wölkchen.
... oder in eine INI. Japp, würde ich wahrscheinlich auch so machen. Initial könnte Programie ja einen nachdatierten manuellen Eintrag machen.
Kaeru Gaman hat geschrieben:davon ab, gibts dafür nicht startup-logs auf servern?
je nach Aktivität des Servers und eingestellte Max-Größe des Logfiles kann es sein,
dass diese Info über kurz oder lang überschrieben wird. die mini-autostart-app wäre
dann die bessere Wahl.

Grüße ... Kiffi
a²+b²=mc²
Antworten