Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   TFileTime addieren (https://www.delphipraxis.net/97167-tfiletime-addieren.html)

sirius 6. Aug 2007 11:44

Re: TFileTime addieren
 
Deswegen musst du ja auch die einzelnen Teile den DWORD-Parts zuweisen und addierst dann die QWORD, so wie in meinem Beispiel.

Luckie 6. Aug 2007 11:51

Re: TFileTime addieren
 
Also so:
Delphi-Quellcode:
        KernelTime64.LowPart := ProcList.Items[i].KernelTime.dwLowDateTime;
        KernelTime64.HighPart := ProcList.Items[i].KernelTime.dwHighDateTime;
        UserTime64.LowPart := ProcList.Items[i].KernelTime.dwLowDateTime;
        UserTime64.HighPart := ProcList.Items[i].KernelTime.dwHighDateTime;
        CPUTime64.QuadPart := KernelTime64.QuadPart + UserTime64.QuadPart;
        CPUTimeft.dwLowDateTime := CPUTime64.LowPart;
        CPUTimeft.dwHighDateTime := CPUTime64.HighPart;
        FileTimeToSystemTime(CPUTimeft, st);
        GetTimeFormatW(LOCALE_SYSTEM_DEFAULT, TIME_FORCE24HOURFORMAT, @st, nil, TimeStr, SizeOf(TimeStr));

Hawkeye219 6. Aug 2007 12:03

Re: TFileTime addieren
 
Wenn du den "Copy&Paste"-Fehler noch korrigierst, könnte es was werden:

Delphi-Quellcode:
//UserTime64.LowPart := ProcList.Items[i].KernelTime.dwLowDateTime;
//UserTime64.HighPart := ProcList.Items[i].KernelTime.dwHighDateTime;
UserTime64.LowPart := ProcList.Items[i].UserTime.dwLowDateTime;
UserTime64.HighPart := ProcList.Items[i].UserTime.dwHighDateTime;
Gruß Hawkeye

Luckie 6. Aug 2007 12:07

Re: TFileTime addieren
 
:oops:

Gausi 18. Feb 2008 14:04

Re: TFileTime addieren
 
Ich häng mich hier mal hintendran, weil ich dasselbe Problem habe, und gerade damit nicht weiterkomme. Ich möchte bestimmen, wieviel Zeit eine Berechnung benötigt, und QueryPerformanceCounter scheint nicht auszureichen (da gibts manchmal Ausreißer, die ich mir nur dadurch erklären kann, dass ein anderer Prozess gerade rumgewerkelt hat). Mein Code sieht so aus:

Delphi-Quellcode:
function GetUsageTime: Int64;
var
  fCreationTime, fExitTime: TFileTime;
  fKernelTime, fUserTime: TFileTime;
  UserTime64, KernelTime64: _Large_Integer;
begin
  GetProcessTimes(GetCurrentProcess, fCreationTime, fExitTime, fKernelTime, fUserTime);

  KernelTime64.LowPart := fKernelTime.dwLowDateTime;
  KernelTime64.HighPart := fKernelTime.dwHighDateTime;
  UserTime64.LowPart := fUserTime.dwLowDateTime;
  UserTime64.HighPart := fUserTime.dwHighDateTime;

  result := KernelTime64.QuadPart + UserTime64.QuadPart;
end;


Function GetAlgorithmTime: Int64;
var s,e: Int64;
begin
      s := GetUsageTime;  // Zeit nehmen
      DoAlgorithm;        // Berechnung ausführen
      e := GetUsageTime;  // Zeit nehmen
      result := e-s;      // Differenz ist das Ergbnis
end;
Aber dabei kommen unsinnige Werte bei raus - sehr oft 0, und ab und zu andere Werte, aber dann recht oft derselbe (oder sogar immer). Irgendwas ist also falsch. Oder geh ich die Sache komplett falsch an?

marabu 18. Feb 2008 16:06

Re: TFileTime addieren
 
Hi,

wenn du ab und zu 0 als Ergebnis erhältst, dann könnte das daran liegen, dass sich die Laufzeit von DoAlgorithm nahe der Zeitauflösung (10 ms) bewegt. Um "einigermaßen verlässliche" Ergebnisse zu erzielen, wirst du wohl minimal 2 * 10 ms messen müssen. Ansonsten halte ich das mehrmalige Auftreten desselben Ergebnisses nicht unbedingt für einen Fehler. Bei geeigneten Testfällen wirst du bemerken, dass du durchaus variierende Zeiten erhältst - aus ähnlichen Gründen wie bei der Verwendung von QueryPerformanceCounter.

Delphi-Quellcode:
function GetUsageTime: TFileTime;
var
  ftDummy: TFileTime;
  ftKernelTime, ftUserTime: TFileTime;
begin
  GetProcessTimes(GetCurrentProcess, ftDummy, ftDummy, ftKernelTime, ftUserTime);
  Result := TFileTime(Int64(ftKernelTime) + Int64(ftUserTime));
end;
Wenn dein System gelegentlich eine Zeitsynchronisierung durchführt, dann sind die Ergebnisse natürlich verfälscht.

Freundliche Grüße

Gausi 18. Feb 2008 17:19

Re: TFileTime addieren
 
Ist die Auflösung bei dem Ding nicht 100ns, also Zehntel Mikro-Sekunden? :gruebel:

Wenn ich deinen Code so abändere, also ohne die abschließende Konvertierung nach TFileTime
Delphi-Quellcode:
function GetUsageTime: Int64;
var
  ftDummy: TFileTime;
  ftKernelTime, ftUserTime: TFileTime;
begin
  GetProcessTimes(GetCurrentProcess, ftDummy, ftDummy, ftKernelTime, ftUserTime);
  Result := (Int64(ftKernelTime) + Int64(ftUserTime));
end;
, dann erhalte ich wieder unsinnige Werte. Das heißt in 80-90% Null, und in den anderen Fällen 31200. Und das kann nicht sein.

Ja, die Algorithmen sind recht schnell, mit QueryPerformanceCounter krieg ich raus, dass die je nach Eingabe nur wenige Dutzend µs brauchen - daher schlägt es ja auch durch, wenn Vista während eines Durchlaufs mal kurz guckt, was sonst noch so zu tun ist. Da sind dann halt ab und zu Ausreißer von ein paar hundert µs dabei, und die machen das Bild kaputt - auch wenn man über mehrere Durchläufe mittelt.

marabu 18. Feb 2008 17:38

Re: TFileTime addieren
 
Die Zeiteinheit von FileTime ist 100 ns - die Auflösung von GetProcessTimes() ist 10 ms, wie bei allen Windows Time Funktionen. Nur die High Precision Timer sind genauer.

Gausi 18. Feb 2008 17:47

Re: TFileTime addieren
 
...mit anderen Worten: Das Ding bringt mir gar nichts. Auch gut - dann muss ich die Ausreißer halt rausdiskutieren.

marabu 18. Feb 2008 18:10

Re: TFileTime addieren
 
Vielleicht solltest du noch nach einer Erklärung für den Wert 31200 suchen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 Uhr.
Seite 2 von 3     12 3      

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