AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Beschränkung von GetTickCount umgehen
Thema durchsuchen
Ansicht
Themen-Optionen

Beschränkung von GetTickCount umgehen

Ein Thema von Dax · begonnen am 25. Okt 2004 · letzter Beitrag vom 3. Dez 2007
Antwort Antwort
Dax
(Gast)

n/a Beiträge
 
#1

Beschränkung von GetTickCount umgehen

  Alt 25. Okt 2004, 14:50
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]
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Beschränkung von GetTickCount umgehen

  Alt 25. Okt 2004, 17:27
Falls TUpTime ein eigener Datentyp ist, wäre dessen Deklaration interessant.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#3

Re: Beschränkung von GetTickCount umgehen

  Alt 25. Okt 2004, 17:29
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..
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#4

Re: Beschränkung von GetTickCount umgehen

  Alt 25. Okt 2004, 18:15
Zitat von Dax:
Delphi-Quellcode:
if QPF = 0 then
  QueryPerformanceFrequency(QPF);
QueryPerformanceCounter(Ticks);
Ticks := Ticks div QPF;
Zitat von MSDN:
If the function fails, the return value is zero.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#5

Re: Beschränkung von GetTickCount umgehen

  Alt 25. Okt 2004, 18:17
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;
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#6

Re: Beschränkung von GetTickCount umgehen

  Alt 26. Okt 2004, 17:06
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?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Beschränkung von GetTickCount umgehen

  Alt 26. Okt 2004, 18:03
Hatte ich hie rnicht gestern einen Link gepostet? Wie dem auch sei, kuck dir das mal an: http://www.luckie-online.de/Delphi/S...ckCountEx.html
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#8

Re: Beschränkung von GetTickCount umgehen

  Alt 26. Okt 2004, 18:04
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...
  Mit Zitat antworten Zitat
4. Nov 2004, 21:00
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.
Benutzerbild von himitsu
himitsu

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

Re: Beschränkung von GetTickCount umgehen

  Alt 3. Dez 2007, 23:05
> 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



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

Delphi-Quellcode:
Function GetTickCount64: UInt64; StdCall;
  External 'Kernel32.dllName '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
Delphi-Quellcode:
Uses Windows, Unit1;

Var C, C2: UInt64;

Begin
  C := GetTickCount64;
  Sleep(3000);
  C2 := GetTickCount64;
  Label1.Caption := IntToStr(C2 - C);
End;
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:57 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