![]() |
Delphi-Version: XE
GetTickCount / Fehler bei Bereichsprüfung
Hallo,
ich habe folgendes Problem... Ich hab einen Service Programmiert der auf einem Windows Server 2008 R2 läuft... Um die Performance meines Services zu überprüfen arbeite ich mit dem GetTickCount um die Start- und Endzeit zu stoppen... Nun das kuriose... Manchmal kann der Service ausgeführt werden, manchmal hängt er sich auf... Aufhängen tut sich der Service an der Stelle wo ich über GetTickCount die Start Zeit in eine Integer Variable übernehme. Als Exception Text bekomme ich "Fehler bei Bereichsprüfung" Mir ist ausserdem noch aufgefallen dass:
Woher kommt der Fehler? Bzw. mache ich was falsch? Hier noch der Source wo ich Zeit abhole:
Delphi-Quellcode:
var
giTimerStart : Integer; begin //Set Result Result := rsSystem_Error; //Info Message prMsgLog(MySQL_Database, tyINF, 0, '', '', 'Save Master Data Tables...', gbBlckInfoMsg); prMsgLog(MySQL_Database, tyINF, 0, '', '', 'Delete Master Data Tables in DETMP', gbBlckInfoMsg); //Drop Tables in DETMP Schema Try If gsPerformCheck = 'YES' Then giTimerStart := GetTickCount(); Except On E:Exception Do Begin prMsgLog(MySQL_Database, tyERR, 0, '', '', E.Message, gbBlckInfoMsg); Exit; End; End; |
AW: GetTickCount / Fehler bei Bereichsprüfung
Kann es sein, dass ser 2008-er Server schon seit 24 oder mehr Tagen läuft?
Dann ist das High-Bit von GetTickCount gesetzt und das Ergebnis passt nicht mehr in den Integer. |
AW: GetTickCount / Fehler bei Bereichsprüfung
![]() Zitat:
Delphi-Quellcode:
If gsPerformCheck = 'YES' Then giTimerStart := integer(GetTickCount());
|
AW: GetTickCount / Fehler bei Bereichsprüfung
Da du ja anscheinend das ganze Projekt mit aktiver bereichsprüfung kompilierst, mußt du halt an solchen Stellen aufpassen.
(oder man deaktiviert an diesen stellen die Bereichsprüfung) Bei impliziten Casts wird bei dir, vom Compiler, eine Bereichsprüfung eingebaut, während das bei expliziten Casts nicht passiert. PS: Du mußt nicht nur bei der Zuweisung aufpassen, sondern auch bei der Berechnug. Wenn Start vor dem Überlauf des Counters liegt und das Ende danach, dann wird auch das Zusammenrechnen abrauchen. |
AW: GetTickCount / Fehler bei Bereichsprüfung
Ich habs grad geprüft...
Der Windows 2008 R2 Server wurde das letzte mal am 15.12. neu gestartet... @DeddyH Danke für den Tipp, werd ich gleich mal ausprobieren... Wenn Deine Variante Funktioniert, muss man da was richtung Uptime berücksichtigen? |
AW: GetTickCount / Fehler bei Bereichsprüfung
Welche Variante meinst Du, den Cast? Nunja, nach einer Uptime von knapp 25 Tagen wird das Ergebnis dann negativ, das Kernproblem bleibt also. Spricht denn etwas gegen GetTickCount64 wie von MS empfohlen?
|
AW: GetTickCount / Fehler bei Bereichsprüfung
Bei dem expliziten Integer-Cast wird der binäre Wert in der Variable nicht verändert.
Man stellt da nur vor der Zuweisung die Interpretierung des höchsten Bits um, womit dann die Wertebereiche zusammen passen. Stell dir es so vor: Delphi erkennt, daß die beiden Typen nicht zusammen passen und macht intern aus deinem
Delphi-Quellcode:
MyInteger := MyCardinal;
ein
Delphi-Quellcode:
TempInt64 := MyCardinal;
if (TempInt64 < Low(MyInteger)) or (TempInt64 > High(MyInteger)) then raise exception....; MyInteger := Integer(TempInt64);
Delphi-Quellcode:
tut jetzt so, als seien die 4 Byte in MyCardinal schon ein Integer, womit das gleich da rein passt.
MyInteger := Integer(MyCardinal);
|
AW: GetTickCount / Fehler bei Bereichsprüfung
Welche Variante meinst Du, den Cast? Nunja, nach einer Uptime von knapp 25 Tagen wird das Ergebnis dann negativ, das Kernproblem bleibt also. Spricht denn etwas gegen GetTickCount64 wie von MS empfohlen?
|
AW: GetTickCount / Fehler bei Bereichsprüfung
Also das mit dem Cast habe ich gerade wie folgt ausprobiert und das Ergebnis erscheint mir plausibel:
Delphi-Quellcode:
Ich bräuchte eine Lösung die sowohl auf einem Windows 2003 Server als auch auf einem Windows 2008 R2 Server läuft...//Start Zeit If gsPerformCheck = 'YES' Then giTimerStart := Integer(GetTickCount()); //Differenz If gsPerformCheck = 'YES' Then Begin gdblTimeDiff := ((Integer(GetTickCount()) - giTimerStart)/1000); prMsgLog(MySQL_Database, tyINF, 99999, '', FloatToStrF(gdblTimeDiff, ffFixed, 5, 3), 'Delete Master Data Tables', gbBlckInfoMsg); End; Geht das mit dem GetTickCount64 in beiden Systemen (2003 & 2008)? |
AW: GetTickCount / Fehler bei Bereichsprüfung
Für eine Differenzberechnung reicht GetTickCount doch aus?
Also egal ob der Wert positiv oder negativ ist. Zusammen mit dem Überlauf bekommt man dennoch immer einen positiven Wert raus, wenn Ende und Start summiert subtrahiert wurden. (solange die zu messende Zeit nicht größer als 2147483647 Millisekunden aka 24.86 Tage wird) PS: auch bei GetTickCount64 gibt es irgendwann einen Überlauf ... man muß nur lange genug warten :angel2: Zitat:
Im Gegensatz zu Emba erwähnt MS bei seinen APIs die Zielsysteme in seiner Hilfe ( ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:44 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