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 Ideale Lösung um Laufdauer eines Programmes zu messen (https://www.delphipraxis.net/147957-ideale-loesung-um-laufdauer-eines-programmes-zu-messen.html)

JBJHJM 19. Feb 2010 17:30


Ideale Lösung um Laufdauer eines Programmes zu messen
 
Hallo,
mein Ziel ist es, zu dokumentieren, wie lange (hh:mm reicht aus) ein Programm läuft. Dazu wird das Programm über mein Delphitool gestartet, und das Delphitool soll dann erkennen, wann das kontrollierte Programm geschlossen wird. Dafür fielen mir zwei Lösungswege ein:
1) Pro Minute eine Funktion aufrufen die kontrolliert, ob der Programmprozess noch läuft
2) Das Tool notiert die Zeit, zu der das Programm gestartet und geschlossen wird. Für letzteres suche ich aber Informationen; wird beim schließen des Programmes automatisch irgendeine verwertbare Windows-Nachricht verschickt?
Danke!

Noedel 19. Feb 2010 17:37

Re: Ideale Lösung um Laufdauer eines Programmes zu messen
 
hmmm...
im onCreate der Form könntest du die Zeit nehmen und im OnClose der Form noch einmal und die Differenz ausrechnen. Dann, bevor die Form geschlossen wird, irgendwo abspeichern.

JBJHJM 19. Feb 2010 17:46

Re: Ideale Lösung um Laufdauer eines Programmes zu messen
 
Habe mich wohl wie so oft verwirrend ausgedrückt :)
Das das ganze auf die Art funktionieren würde ist mir schon klar, allerdings soll mein Tool von alleine erkennen, wann das andere Programm geschlossen wird! (muss aber nicht unbedingt auf die Sekunde genau sein.)
Denn ansonsten vergesse ich garantiert, es manuell zu beenden, und dann ist die Auswertung der Arbeitszeit total versaut...

arbu man 19. Feb 2010 22:04

Re: Ideale Lösung um Laufdauer eines Programmes zu messen
 
Du könntest das zu startende Programm mit ShellExecute und WaitForSignleObject ausführen (Forensuche hilft). Dann hast du den Zeitpunkt des start und des Ende des Prozesses.

Delphi-Quellcode:
saveTime('Start');
ShellExecuteWait(...)
saveTime('Stop')
Gruß Björn

Sir Rufo 19. Feb 2010 23:27

Re: Ideale Lösung um Laufdauer eines Programmes zu messen
 
Zitat:

Zitat von JBJHJM
Denn ansonsten vergesse ich garantiert, es manuell zu beenden, und dann ist die Auswertung der Arbeitszeit total versaut...

:wiejetzt:
Wenn du es nicht beendest, wie soll denn dann dein Tool erkennen das es doch beendet ist, obwohl es gar nicht beendet ist

JBJHJM 19. Feb 2010 23:37

Re: Ideale Lösung um Laufdauer eines Programmes zu messen
 
Zitat:

Zitat von arbu man
Du könntest das zu startende Programm mit ShellExecute und WaitForSignleObject ausführen (Forensuche hilft). Dann hast du den Zeitpunkt des start und des Ende des Prozesses.

Delphi-Quellcode:
saveTime('Start');
ShellExecuteWait(...)
saveTime('Stop')
Gruß Björn

Vielen Dank! Habe es jetzt erstmal mit der ersten Variante gelöst, aber die werde ich mir natürlich auch angucken und zumindest für die Zukunft archivieren!

@Sir Rufo: :roll:
Ich seh schon es gibt hier etwas Gewirr, ich habe unterschieden zwischen "Tool" - das Delphi-Dingsda, das ich programmiere - und "Programm" - dem Programm, was das Tool überwachen soll. Damit ich nicht immer das Tool separat an/ausschalten muss, sollte es nach möglichkeit selbstständig laufen, sprich wenn das Tool gestartet wird, startet es gleich das definierte Programm, und wenn letzteres beendet wird, soll das Tool dies automatisch erkennen, die Daten speichern und sich beenden.

:cheers:

Fridolin Walther 28. Feb 2010 19:27

Re: Ideale Lösung um Laufdauer eines Programmes zu messen
 
Zitat:

Zitat von JBJHJM
2) Das Tool notiert die Zeit, zu der das Programm gestartet und geschlossen wird. Für letzteres suche ich aber Informationen; wird beim schließen des Programmes automatisch irgendeine verwertbare Windows-Nachricht verschickt?

Object Handles können zur Synchronisation genutzt werden - das Prozesshandle ist da kein Unterschied. Wenn Du also mit MSDN-Library durchsuchenCreateProcess oder MSDN-Library durchsuchenShellExecuteEx einen Prozess erstellst, kannst Du mit MSDN-Library durchsuchenWaitForSingleObject darauf warten, daß dieses signalisiert wird, was bei Prozessen bedeutet, daß sie beendet wurden. Aber es kommt noch besser: Windows liefert Dir mit Hilfe des Prozesshandles dann sogar noch alle Timing Informationen frei Haus.

Und als ob das nicht genug wäre, gibts hier sogar ne fertige Funktion:
http://www.delphipraxis.net/internal...=872205#872205


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