AGB  ·  Datenschutz  ·  Impressum  







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

TFileTime addieren

Ein Thema von Luckie · begonnen am 6. Aug 2007 · letzter Beitrag vom 19. Feb 2008
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Luckie
Luckie

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

TFileTime addieren

  Alt 6. Aug 2007, 09:15
Wie addiere ich zwei TFileTime-Werte?
Delphi-Quellcode:
CPUTime.dwLowDateTime := ProcList.Items[i].KernelTime.dwLowDateTime + ProcList.Items[i].UserTime.dwLowDateTime;
CPUTime.dwHighDateTime := ProcList.Items[i].KernelTime.dwHighDateTime + ProcList.Items[i].UserTime.dwHighDateTime;
Das stimmt irgendwie nicht. Denn wenn ich das in eine Zeit umwandele,
Delphi-Quellcode:
FileTimeToLocalFileTime(CPUTime, lft);
FileTimeToSystemTime(lft, st);
GetTimeFormatW(LOCALE_SYSTEM_DEFAULT, TIME_FORCE24HOURFORMAT, @st, nil, TimeStr, SizeOf(TimeStr));
kommt ein falscher Wert dabei raus.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: TFileTime addieren

  Alt 6. Aug 2007, 09:22
Wozu addierst Du die Werte denn bzw. was soll dabei rauskommen?

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: TFileTime addieren

  Alt 6. Aug 2007, 09:24
Die CPU Zeit eines Prozesses setzt sich zusammen aus der zeit, die er im Kernel-Mode und User-Mode war. Deswegen muss ich sie addieren.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#4

Re: TFileTime addieren

  Alt 6. Aug 2007, 09:27
Hi,

Also in meiner D7 W32-SDK Hilfe steht zu FileTime
Zitat:
It is not recommended that you add and subtract values from the FILETIME structure to obtain relative times. Instead, you should
· Copy the resulting FILETIME structure to a LARGE_INTEGER structure.
· Use normal 64-bit arithmetic on the LARGE_INTEGER value.
Vielleicht hilft Dir das weiter.

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: TFileTime addieren

  Alt 6. Aug 2007, 09:35
Hm, und wie kopiere ich das in eine LARGE_INTEGER Struktur? Und wie bekomme ich davon dann wieder die Zeit?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: TFileTime addieren

  Alt 6. Aug 2007, 09:52
Wie wärs z.B. damit:
Delphi-Quellcode:
type TLargeTime=record
       case boolean of
         True: (DWlo:cardinal;DWHi:cardinal);
         False: (QW:int64);
end;
//kein Ahnung ob lo oder hi zuerst kommt, aber da wir bei little endian sind....
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:TLargeTime;
begin
  a.DWlo:=5;
  a.DWHi:=0;
  memo1.lines.add('A: '+inttostr(a.qw));

  b.DWlo:=0;
  b.DWHi:=6;
  memo1.lines.add('B: '+inttostr(b.qw));

  c.qw:=a.qw+b.qw;

  memo1.lines.add('C: '+inttostr(c.qw));
end;
Edit: Wichtig ist, dass in ASM bei der Addtion der Hi DWords ein "adc" statt eines "add" genommen wird, um den Übertrag aus der zuvor erfolgten Addition (hier reicht add) der Lo DWords mitzunehmen.

Edit2: Was die Unit Windows nicht so alles bietet
Delphi-Quellcode:
_LARGE_INTEGER = record
    case Integer of
    0: (
      LowPart: DWORD;
      HighPart: Longint);
    1: (
      QuadPart: LONGLONG);
  end;
PS: Irgendwie beist sich bei der Bezeichnung doch was:
1. DateTime -normalerweise double
2. dw* -steht eher für DWORD
3. Was ist dann DW*DATETIME?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Leonard

Registriert seit: 12. Okt 2005
Ort: Lutherstadt Eisleben
64 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: TFileTime addieren

  Alt 6. Aug 2007, 09:53
Zitat von Luckie:
Hm, und wie kopiere ich das in eine LARGE_INTEGER Struktur? Und wie bekomme ich davon dann wieder die Zeit?
Hi,
hier http://www.swissdelphicenter.ch/torr...ode.php?id=969 wird mit LARGER_INTEGER rumgerechnet. Ich denke, da könnte auch das passende für dich dabei sein.

mfg Leonard
Tobias
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: TFileTime addieren

  Alt 6. Aug 2007, 10:05
Danke für den Link:

Delphi-Quellcode:
        CPUTime64.LowPart := ProcList.Items[i].KernelTime.dwLowDateTime + ProcList.Items[i].UserTime.dwLowDateTime;
        CPUTime64.HighPart := ProcList.Items[i].KernelTime.dwHighDateTime + ProcList.Items[i].UserTime.dwHighDateTime;
        CPUTimeft.dwLowDateTime := CPUTime64.LowPart;
        CPUTimeft.dwHighDateTime := CPUTime64.HighPart;
        //CPUTime := (ProcList.Items[i].KernelTime.dwLowDateTime shl 32) + ProcList.Items[i].UserTime.dwHighDateTime;
        FileTimeToSystemTime(lft, st);
        GetTimeFormatW(LOCALE_SYSTEM_DEFAULT, TIME_FORCE24HOURFORMAT, @st, nil, TimeStr, SizeOf(TimeStr));
PS: Man sollte bei der CPU-Zeit auch nicht die Zeitzone berücksichtigen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

Re: TFileTime addieren

  Alt 6. Aug 2007, 10:32
Hallo Michael,

du hast Sirius' Ergänzung offenbar überlesen:

Zitat von sirius:
Edit: Wichtig ist, dass in ASM bei der Addtion der Hi DWords ein "adc" statt eines "add" genommen wird, um den Übertrag aus der zuvor erfolgten Addition (hier reicht add) der Lo DWords mitzunehmen.
Es reicht nicht, Lo- und Hi-Teil getrennt zu addieren, weil dabei ein eventueller Übertrag unterschlagen wird. Du mußt eigentlich nur so vorgehen wie bei der schriftliche Addition von Dezimalzahlen - oder so, wie sirius es zuvor gezeigt hat.

Das hier

Zitat:
//CPUTime := (ProcList.Items[i].KernelTime.dwLowDateTime shl 32) + ProcList.Items[i].UserTime.dwHighDateTime;
ist zwar auskommentiert, beinhaltet aber einige Fehler, die möglicherweise auch an anderen Stellen in deinem Quelltext vorkommen. Zunächst werden zwei Teile aus unterschiedlichen Strukturen (KernelTime und UserTime) verheiratet, wahrscheinlich ist das nur ein Schreibfehler. Dann wird der niederwertige Anteil verschoben - richtig wäre der höherwertige Anteil. Der letzte Fehler: bei einer Verschiebung um 32 Bits passiert nichts, wenn das Argument nicht zuvor nach Int64 gecastet wird.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: TFileTime addieren

  Alt 6. Aug 2007, 11:06
Zitat von Hawkeye219:
oder so, wie sirius es zuvor gezeigt hat.
Leder kann ich die QuadParts nicht addieren, da TFileTime dies nicht besitzt, deswegen hatte ich es einzeln addiert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 23:40 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