Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Beschränkung von GetTickCount umgehen (https://www.delphipraxis.net/32568-beschraenkung-von-gettickcount-umgehen.html)

Dax 25. Okt 2004 13:50


Beschränkung von GetTickCount umgehen
 
Ich hab' das ganze nochmal ein wenig optimiert, muss nicht alle High(DWORD) Millisekunden mehr ausgeführt werden, sondern kann beliebig aufgerufen werden:
Delphi-Quellcode:
var
  QPF: Int64 = 0;

function GetTickCountEx: TUpTime;
begin
  if QPF = 0 then
    QueryPerformanceFrequency(QPF);
  QueryPerformanceCounter(Ticks);
  Ticks := Ticks div QPF;

  with Result do
  begin
    MilliSeconds := Ticks mod 1000;
    Seconds := (Ticks div 1000) mod 60;
    Minutes := (Ticks div 60000) mod 60;
    Hours := (Ticks div 3600000) mod 24;
    Days := ((Ticks div 3600000) div 24) mod 30;
    Months := ((Ticks div 3600000) div 24) div 30;
    Years := ((Ticks div 3600000) div 24) div 365;
  end;
end;
[edit=Chakotay1308]Beitrag befindet sich nun hier in der Code-Library. Mfg, Chakotay1308[/edit]

Luckie 25. Okt 2004 16:27

Re: Beschränkung von GetTickCount umgehen
 
Falls TUpTime ein eigener Datentyp ist, wäre dessen Deklaration interessant.

Dax 25. Okt 2004 16:29

Re: Beschränkung von GetTickCount umgehen
 
Der Beitrag war eingentlich als Ergänzung zu einem urspünglichen EIntrag in der Codelib gedacht, ich dachte, der wäre schon lange verschoben worden...
Na ja, ein Link kann ja nicht schaden.. :P

NicoDE 25. Okt 2004 17:15

Re: Beschränkung von GetTickCount umgehen
 
Zitat:

Zitat von Dax
Delphi-Quellcode:
if QPF = 0 then
  QueryPerformanceFrequency(QPF);
QueryPerformanceCounter(Ticks);
Ticks := Ticks div QPF;

Zitat:

Zitat von MSDN
If the function fails, the return value is zero.


Dax 25. Okt 2004 17:17

Re: Beschränkung von GetTickCount umgehen
 
So besser?
Delphi-Quellcode:
var
  QPF: Int64 = 0;

function GetTickCountEx: TUpTime;
begin
  if QPF = 0 then
    QueryPerformanceFrequency(QPF);
  QueryPerformanceCounter(Ticks);
  if (QPF = 0) or (Ticks = 0) then
  begin
    Result.Milliseconds := Word(-1);
    Exit;
  end;
  Ticks := Ticks div QPF;

  with Result do
  begin
    MilliSeconds := Ticks mod 1000;
    Seconds := (Ticks div 1000) mod 60;
    Minutes := (Ticks div 60000) mod 60;
    Hours := (Ticks div 3600000) mod 24;
    Days := ((Ticks div 3600000) div 24) mod 30;
    Months := ((Ticks div 3600000) div 24) div 30;
    Years := ((Ticks div 3600000) div 24) div 365;
  end;
end;

NicoDE 26. Okt 2004 16:06

Re: Beschränkung von GetTickCount umgehen
 
Zitat:

Zitat von Dax
So besser?

QueryPerformanceFrequency ist eine Funktion.
Warum verläßt Du dich darauf, dass die Funktion den Parameter in einem bestimmten (nicht dokumentierten) Zustand hinterläßt, anstatt den Rückgabewert zu verwenden?

Luckie 26. Okt 2004 17:03

Re: Beschränkung von GetTickCount umgehen
 
Hatte ich hie rnicht gestern einen Link gepostet? :gruebel: Wie dem auch sei, kuck dir das mal an: http://www.luckie-online.de/Delphi/S...ckCountEx.html

Dax 26. Okt 2004 17:04

Re: Beschränkung von GetTickCount umgehen
 
Wenn ich mich nicht irre, war der Link sinnlos: Das selbe steht schon in der Codelib, auch von NicoDE. Ich hab' nur meinen Algorithmus verbessert und wollte, das es eingetragen wird...

DP-Maintenance 4. Nov 2004 20:00

DP-Maintenance
 
Dieses Thema wurde von "Chakotay1308" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Windows API" verschoben.
Der Beitrag geht zurück in den öffentl. Bereich zur Diskussion; Source in die Code-Library eingefügt.

himitsu 3. Dez 2007 22:05

Re: Beschränkung von GetTickCount umgehen
 
> CodeLib > Beschränkung von GetTickCount umgehen


Erstmal was zu Dax letztem CL-Code:
Ticks ist wärend der Zuweisung an Result in Sekundenintervallen und nicht in Millisekunden ... das Ergebnis stimmt also nicht :warn:



So und nun was Neues/Erfreuliches:
In Vista hat Microsoft sich endlich dieses Problems gewidmet und MSDN-Library durchsuchenGetTickCount64 eingeführt. :hello:

Delphi-Quellcode:
Function GetTickCount64: UInt64; StdCall;
  External 'Kernel32.dll' Name 'GetTickCount64';

Und das Ganze noch als nette Unit, welche auch schon früher läuft:
Delphi-Quellcode:
Unit GTCUnit;

// (c) 1997-2007 by FNS Enterprize's (FNSE.de)
//     2003-2007 by himitsu @ Delphi-PRAXiS.de
 
Interface
  Uses Windows;

  Var GetTickCount64: Function(): UInt64; StdCall;

Implementation
  Function _GetTickCount64: UInt64; StdCall;
    Var Freq, Ticks: UInt64;

    Begin
      If QueryPerformanceFrequency(Int64(Freq))
        and QueryPerformanceCounter(Int64(Ticks))
        and (Int64(Freq) > 0) Then Begin

        If Ticks >= UInt64(-1) div 1000 Then Result := Ticks div (Freq div 1000)
        Else Result := (Ticks * 1000) div Freq;
      End Else Result := 0;
    End;

Initialization
  GetTickCount64 := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'GetTickCount64');
  If @GetTickCount64 = nil Then GetTickCount64 := @_GetTickCount64;

End.
Einfach Unit einbinden und GetTickCount64 wie eine normale Funktion aufrufen :angel:
Delphi-Quellcode:
Uses Windows, Unit1;

Var C, C2: UInt64;

Begin
  C := GetTickCount64;
  Sleep(3000);
  C2 := GetTickCount64;
  Label1.Caption := IntToStr(C2 - C);
End;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 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