Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   Windows-Pendant zu time-Befehl unter Linux (https://www.delphipraxis.net/111984-windows-pendant-zu-time-befehl-unter-linux.html)

MrKnogge 12. Apr 2008 20:20


Windows-Pendant zu time-Befehl unter Linux
 
Hallo,

unter Linux ist es ja möglich, eine Anwednung oder einen Prozess per time-Befehl zu starten, um nach Ablauf des Programms die tatsächliche Rechenzeit zu bekommen. Gibt es soetwas auch unter Windows ?

wido 12. Apr 2008 20:44

Re: Windows-Pendant zu time-Befehl unter Linux
 
Nein, so weit ich weiß nicht. Ist aber trivial zu implementieren:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows, ShellAPI;

function ExecuteWaitAndTime(Filename, Params : string; var DeltaTime : cardinal) : boolean;
var
  ExecuteInfo: TShellExecuteInfo;
begin
  ZeroMemory(@ExecuteInfo, sizeof(ExecuteInfo));
  with ExecuteInfo do
  begin
    cbSize := sizeof(ExecuteInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS;
    lpVerb := 'open';
    lpFile := PChar(Filename);
    lpParameters := PChar(Params);
    nShow := SW_SHOWNORMAL;
  end;
  if ShellExecuteEx(@ExecuteInfo) then
  try
      result := true;
      DeltaTime := GetTickCount;
      WaitForSingleObject(ExecuteInfo.hProcess, INFINITE);
      DeltaTime := GetTickCount - DeltaTime;
  finally
    CloseHandle(ExecuteInfo.hProcess);
  end;
end;

var
  i : cardinal;
begin
  writeln(ExecuteWaitAndTime('notepad.exe', '', i));
  writeln(i);
  readln;
end.
Im Endeffekt startest Du den Prozess, fragst den aktuellen TickCount (Anzahl der vergangenen Millisekunden seit Systemstart), wartest bis die Anwendung fertig ist und subtrahierst den ersten TickCount vom aktuellen. Ergebnis ist die Zeit in Millisekunden die die Anwendung zur Ausführung benötigt hat.

Der Code oben basiert übrigens grob auf dem Code von Assarbad. Mags nur erwähnt wissen, nicht das einer rumschreit ich klau Code :P.

MrKnogge 12. Apr 2008 21:15

Re: Windows-Pendant zu time-Befehl unter Linux
 
Das kann man nicht implementieren!
GetTickount kenne ich, ich möchte nicht wissen wieviel zeit vergeht, bis mein Prozess zuende gerechnet wurde, sondern die tatsächliche Rechenzeit, ohne die Rechenzeit der anderen laufenden Prozesse.

Apollonius 12. Apr 2008 21:19

Re: Windows-Pendant zu time-Befehl unter Linux
 
MSDN-Library durchsuchenGetProcessTimes

xZise 12. Apr 2008 21:19

Re: Windows-Pendant zu time-Befehl unter Linux
 
Problem:
GetTickCount gibt die aktuelle Uhrzeit an, aber nicht die Zeit, die der Prozess tatsächlich verwendet.
Luckie hat in einem Hier im Forum suchenThread-Tutorial glaub ich geschrieben, wie man die Rechnenzeit des Prozesses bekommt.

Ein Beispiel wäre, wenn du Notepad mit niedrigster Priortät startest, und während der Ausführung startest du ein Intensives Programm, welches zu fast 100% deine CPU braucht: Ergebnis ist, dass Notepad weniger Rechenzeit bekommt.
Und was ist wenn du Notepad gar nicht beachtest: Sozusagen starten, idlen und dann beenden: Kaum Rechenzeit verwendet, aber es ist Zeit vergangen.

MfG
xZise

wido 12. Apr 2008 22:10

Re: Windows-Pendant zu time-Befehl unter Linux
 
Ach herje, ja. Asche auf mein Haupt. Habs komplett überlesen. Aber dann implementier ich Dir halt einfach mal, das was Du willst:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows, ShellAPI;

function ExecuteWaitAndTime(Filename, Params : string; var DeltaUserTime, DeltaKernelTime, DeltaExecutionTime : cardinal) : boolean;
var
  ExecuteInfo: TShellExecuteInfo;
  CreationTime, ExitTime, KernelTime, UserTime : _FILETIME;
begin
  ZeroMemory(@ExecuteInfo, sizeof(ExecuteInfo));
  with ExecuteInfo do
  begin
    cbSize := sizeof(ExecuteInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS;
    lpVerb := 'open';
    lpFile := PChar(Filename);
    lpParameters := PChar(Params);
    nShow := SW_SHOWNORMAL;
  end;
  if ShellExecuteEx(@ExecuteInfo) then
  try
      result := true;
      WaitForSingleObject(ExecuteInfo.hProcess, INFINITE);
      GetProcessTimes(ExecuteInfo.hProcess, CreationTime, ExitTime, KernelTime, UserTime);
      DeltaExecutionTime := (Int64(ExitTime) - Int64(CreationTime)) div 10000;
      DeltaUserTime := Int64(UserTime) div 10000;
      DeltaKernelTime := Int64(KernelTime) div 10000;
   finally
    CloseHandle(ExecuteInfo.hProcess);
  end
  else result := false;
end;

var
  ExecutionTime, UserTime, KernelTime : cardinal;
begin
  writeln(ExecuteWaitAndTime('notepad.exe', '', UserTime, KernelTime, ExecutionTime));
  writeln('Execution time: ', ExecutionTime);
  writeln('CPU time in user mode: ', UserTime);
  writeln('CPU time in kernel mode: ', KernelTime);
  readln;
end.

wido 12. Apr 2008 22:12

Re: Windows-Pendant zu time-Befehl unter Linux
 
Zitat:

Zitat von xZise
Problem:
GetTickCount gibt die aktuelle Uhrzeit an, aber nicht die Zeit, die der Prozess tatsächlich verwendet.
Luckie hat in einem Hier im Forum suchenThread-Tutorial glaub ich geschrieben, wie man die Rechnenzeit des Prozesses bekommt.

Danke für den Hinweis, aber ich weiß wie Threads funktionieren ;). Hab halt einfach nur das Posting überflogen und das Rechen bei Rechenzeit überlesen ;).

xZise 12. Apr 2008 23:00

Re: Windows-Pendant zu time-Befehl unter Linux
 
Zitat:

Zitat von wido
Zitat:

Zitat von xZise
Problem:
GetTickCount gibt die aktuelle Uhrzeit an, aber nicht die Zeit, die der Prozess tatsächlich verwendet.
Luckie hat in einem Hier im Forum suchenThread-Tutorial glaub ich geschrieben, wie man die Rechnenzeit des Prozesses bekommt.

Danke für den Hinweis, aber ich weiß wie Threads funktionieren ;). Hab halt einfach nur das Posting überflogen und das Rechen bei Rechenzeit überlesen ;).

Es ging da nicht darum wie Threads funktionieren. Naja ^^ Nicht ganz ;) Es ging darum, aber ich meinte, dass dort stand wie man die Rechenzeit des Threads ermittelt.

MfG
xZise

MrKnogge 13. Apr 2008 11:21

Re: Windows-Pendant zu time-Befehl unter Linux
 
Wow, Danke, werde ich gleich mal testen!

Wenn es sogar eine API-Funktion "GetProcessTimes" gibt, ist es doch gut möglich, dass es ddie Eingabeaufforderung auch kann, oder ?

wido 13. Apr 2008 16:17

Re: Windows-Pendant zu time-Befehl unter Linux
 
Zitat:

Zitat von MrKnogge
Wenn es sogar eine API-Funktion "GetProcessTimes" gibt, ist es doch gut möglich, dass es ddie Eingabeaufforderung auch kann, oder ?

Hm, nicht das ich wüsste. Allerdings ist es gut möglich, daß jemand time portiert hat. Aber ganz ehrlich ... es wäre trivial den Source oben umzuändern in einen Consolen Befehl. Statt Notepad.exe und leere Parameterliste einfach die Parameter die der Anwendung übergeben wurden einsetzen.

Edit:
Google spuckt unter anderem folgenden Fund aus, der für Dich recht interessant sein sollte:
http://channel9.msdn.com/ShowPost.aspx?PostID=356650


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:03 Uhr.
Seite 1 von 2  1 2      

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