AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GetTickCount / Fehler bei Bereichsprüfung

Ein Thema von Andidreas · begonnen am 15. Jan 2014 · letzter Beitrag vom 16. Jan 2014
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 15:43
Delphi-Version: XE
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:
  1. ich mit derselben Logik auf einem Windows Server 2003 keine Probleme habe
  2. ich auf meinem Windows 7 Notebook ebenfalls keine Probleme habe

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 = 'YESThen giTimerStart := GetTickCount();
  Except
    On E:Exception Do
    Begin
      prMsgLog(MySQL_Database, tyERR, 0, '', '', E.Message, gbBlckInfoMsg);
      Exit;
    End;
  End;
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#2

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 15:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 15:49
GetTickCount
Zitat:
The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if the system is run continuously for 49.7 days. To avoid this problem, use the GetTickCount64 function. Otherwise, check for an overflow condition when comparing times.
Evtl. bringt es ja schon Besserung, giTimerStart als DWORD zu deklarieren oder bei der Zuweisung zu casten.
If gsPerformCheck = 'YESThen giTimerStart := integer(GetTickCount());
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 15:53
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.
$2B or not $2B

Geändert von himitsu (15. Jan 2014 um 15:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 15:59
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?
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 16:06
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 16:06
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

MyInteger := MyCardinal;

ein

Delphi-Quellcode:
TempInt64 := MyCardinal;
if (TempInt64 < Low(MyInteger)) or (TempInt64 > High(MyInteger)) then
  raise exception....;
MyInteger := Integer(TempInt64);
MyInteger := Integer(MyCardinal); tut jetzt so, als seien die 4 Byte in MyCardinal schon ein Integer, womit das gleich da rein passt.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#8

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 16:14
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 16:19
Also das mit dem Cast habe ich gerade wie folgt ausprobiert und das Ergebnis erscheint mir plausibel:

Delphi-Quellcode:

//Start Zeit
If gsPerformCheck = 'YESThen giTimerStart := Integer(GetTickCount());

//Differenz
If gsPerformCheck = 'YESThen
Begin
  gdblTimeDiff := ((Integer(GetTickCount()) - giTimerStart)/1000);
  prMsgLog(MySQL_Database, tyINF, 99999, '', FloatToStrF(gdblTimeDiff, ffFixed, 5, 3), 'Delete Master Data Tables', gbBlckInfoMsg);
End;
Ich bräuchte eine Lösung die sowohl auf einem Windows 2003 Server als auch auf einem Windows 2008 R2 Server läuft...
Geht das mit dem GetTickCount64 in beiden Systemen (2003 & 2008)?
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: GetTickCount / Fehler bei Bereichsprüfung

  Alt 15. Jan 2014, 16:20
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

Zitat:
Geht das mit dem GetTickCount64 in beiden Systemen (2003 & 2008)?
Schau doch nach?
Im Gegensatz zu Emba erwähnt MS bei seinen APIs die Zielsysteme in seiner Hilfe (MSDN-Library durchsuchenGetTickCount64).
$2B or not $2B

Geändert von himitsu (15. Jan 2014 um 16:33 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 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