![]() |
CPU-Auslastung eines Prozesses
Hallo,
ich habe schon gesucht, konnte aber nichts zu dem Thema finden. Was ich gerne haben möchte: Ich möchte mit einem Programm die CPU-Auslastung eines mir namentlich bekannten Prozesses ermitteln. Am besten wäre es, wenn eine Methode mir einen Wert zurückliefert, wie es im Windows Task Manager steht. Noch mal zum Sinn und Zweck: Mit einem Programm lasse ich eine Autodesk-Zeichnung erstellen. Dazu starte ich den Mechanical Desktop (der immer etwas länger braucht zum Laden). Ich will nun mit Tastatureigaben Befehle ausführen in Mechanical Desktop. Dazu muss Mechanical Desktop komplett geladen sein. Das will ich an der CPU-Auslastung des Prozess erkennen. Das Verhalten habe ich auch mit dem Task Manager schon beobachtet und wird auch klappen. Nun brauche ich halt dazu einen Code. Hat von Euch vielleicht jemand so einen Code parat bzw. ist das überhaupt möglich, das auszulesen? Ich selber habe von diesem Bereich nun keine Ahnung. Es wäre echt nett von Euch, wenn Ihr mir helfen könntet. Beste Grüße und Vielen Dank für Eure Bemühungen Ulrich |
Re: CPU-Auslastung eines Prozesses
Hallo Ulrich,
mithilfe der Win32-API-Funktion GetProcessTimes kannst Du die Gesamt(Kernel-)Zeit gkt eines Prozesses ermitteln. Wenn Du nun diese Funktion zweimal innerhalb des Zeitraums t aufrufst, sollte (gkt2-gkt1)/t das gewünschte Ergebnis liefern. Willst Du die Zeit gegen die anderen Prozesse vergleichen, solltest Du Dir CreateToolhelp32Snapshot, Process32First, Process32Next, etc. ansehen. Zugegeben, nicht wirklich elegant. |
Re: CPU-Auslastung eines Prozesses
Hallo choose,
nur mal eine Verständnis Frage von mir: Gibt die Kernel Zeit an, wie lange der Prozessor für diesen Prozess Befehle ausführt oder worauf bezieht sich diese Angabe? Dann noch mal eine zusätzliche Frage: Ich brauche für diese Methode das Handle des Prozesses. Dazu möchte ich gerne die Funktion getProcId von ![]() Beste Grüße Ulrich |
Re: CPU-Auslastung eines Prozesses
Beides kannst du hier:
![]() |
Re: CPU-Auslastung eines Prozesses
Hallo Luckie,
danke für den Tipp insbesondere mit dem "T". Da wäre ich bestimmt als Delphi Progger drauf reingefallen. :lol: Beste Grüße Ulrich |
Re: CPU-Auslastung eines Prozesses
Hallo Ulrich,
falls Du die Dinge offline (leider oft nicht ganz so ausführlich wie beim msdn) lesen möchtest, verweise ich auf die MS SDK Help Files und hier auf die Borland Shared\MSHelp\WIN32.HLP. Diese Dateien sollte bei Deiner D5-Version installiert und auch in die IDE integriert worden sein, so dass Du, mit dem Cursor über einer Funktion wie Process32Next stehend, mit F1 die entsprechende Seite angezeigt bekommen solltest. Beim BDN gibt es auch irgendwo ein Update dieser Dateien... |
Re: CPU-Auslastung eines Prozesses
Moin Choose,
oder man geht in die Vollen, und lädt sich bei MS das PSDK runter (allerdings ca. 350 MB Download für Vollinstallation). |
Re: CPU-Auslastung eines Prozesses
Offline brauche ich das nicht. Ich habe DSL mit Flat und deswegen brauche ich das net. Aber danke für den Hinweis.
Den Trick mit F1 kenne ich schon. Ich habe halt nur eine veraltete Hilfe in der Hinsicht. Ich müßte mal bei Borland suchen, ob ich da etwas entsprechendes finde. Das wäre dann natürlich auch klasse. Ulrich |
Re: CPU-Auslastung eines Prozesses
Hallo,
ich brauche nun noch mal Eure Hilfe: Ich starte meinen Prozess mit ShellexecuteEx und erhalte darüber das Handle auf den Prozess (funktioniert ohne Probleme). Nun will ich die CPU-Auslastung anzeigen lassen. Dazu rufe ich erst mal zu Testzwecken die Funktion getProcesstimes so auf:
Delphi-Quellcode:
Er zeigt mir auch alle Werte richtig an bis auf den Wert KernelTime: Da steht immer 00:00:00 und es ändert sich auch nichts daran. Ich rufe das alles mit einem Timmer alle 50msek. auf. Ich rufe ein Programm auf, dass die CPU alle regelmößig auslastet (alle 6 sek., Fibonucci Algorithmus).Var CreateTime : TFileTime; KernelTime : TFileTime; UserTime : TFileTime; ExitTime : TFileTime; Function FileTimeToLocalDateTime(Time : TFileTime) : TDatetime; Var SysTime : TSystemTime; Begin FileTimeToLocalFileTime(Time,Time); FileTimeToSystemTime(Time, SysTime); Result := SystemTimeToDateTime(SysTime); End; Function FileTimeToDateTime(Time : TFileTime) : TDatetime; Var SysTime : TSystemTime; Begin FileTimeToSystemTime(Time, SysTime); Result := SystemTimeToDateTime(SysTime); End; begin //handle2 ist das ermittelte handle mit shellexecuteex GetProcessTimes(handle2,CreateTime,ExitTime,KernelTime,Usertime); LabelCreate.Caption := DateTimeToStr(FileTimeToLocalDateTime(CreateTime)); LabelExit.Caption := DateTimeToStr(FileTimeToLocalDateTime(ExitTime)); LabelKernel.Caption := TimeToStr(FileTimeToDateTime(KernelTime)); LabelUser.Caption := TimeToStr(FileTimeToDateTime(UserTime)); end; Ich habe noch nicht den Vergleich über einen Zeitram vorgenommen, weil es momentan meiner Ansicht nach keinen Sinn macht. Beste Grüße Ulrich |
Re: CPU-Auslastung eines Prozesses
Hm, dann wird dein Programm keinen Code im Kernel-Modus ausführen, sondern ausschließlich im User-Mode arbeiten. Oder berechnest du die zahlen mit irgendwelchen Kernel-Funktionen?
|
Re: CPU-Auslastung eines Prozesses
Hallo,
mh, ich habe das Programm eigentlich nur genommen, um zu sehen, ob es geht. Nachher will ich Mechanical Desktop nehmen. Da wird sicherlich so was gemacht, dass irgendetwase im Kernel berechnet wird. Muss ich gleich mal ausprobieren. Beste Grüße Ulrich |
Re: CPU-Auslastung eines Prozesses
Hallo,
Thema hat sich erledigt. Es klappt alles. Es lag daran,d ass ich gedacht hatte, dass die Usertime angibt, wie lange das Prog läuft (ist aber nicht so). Ich dachte, allein die Kernel-zeit gibt Aufschluss über die Aktivität eines Proggs. Beste Grüße Ulrich |
Re: CPU-Auslastung eines Prozesses
Das Problem kann man auch anders angehen:
WaitForInputIdle(ProcessHandle,INFINITE); Wo man Gutes in Frage stellt, kann Besseres entstehen... |
Re: CPU-Auslastung eines Prozesses
Nein, UserTiem gibt an wie wviel zeit das Programm tatsächlich damit beschäftigt ist Programmcode auszuführen. Ein Thread bekommt ja nur zeitscheibenweise CPU Zeit zugeteilt. Und mit GetProcessTimes / GetThreadTimes bekommst du die Zeit, die ein Prozess / Thread damit verbringt tatsächlich Code auszuführen.
|
Re: CPU-Auslastung eines Prozesses
Zitat:
Kannst Du noch einmal zeigen, wie Du den Prozess erzeugst? Danke. Zitat:
|
Re: CPU-Auslastung eines Prozesses
shellexecute liefert weder ein Handle des Fensters zurück noch die ProcessID. Entweder CreateProcess oder ShellexecuteExe nehmen.
|
Re: CPU-Auslastung eines Prozesses
Hallo Choose,
da hast Du nicht genau gelesen. Ich habe die funktion ShellExecuteEx benutzt und nicht ShellExecute. Da Du so nett bist und mir geholfen hast, bekommst Du gleich noch den Code von mir:
Delphi-Quellcode:
Beste Grüße
var Info: TShellExecuteInfo;
FileName : string; begin FileName := 'c:\2\Project2.exe'; with Info do begin cbSize := SizeOf(Info); fMask := SEE_MASK_NOCLOSEPROCESS; lpVerb := 'open'; lpFile := pChar(FileName); lpParameters := nil; lpDirectory := nil; nShow := 0; hInstApp := 0; lpIDList := nil; end; { Call indows to display the properties dialog. } ShellExecuteEx(@Info); //Das Handle des Prozesses auslesen handle2 := info.hProcess; end; Ulrich |
Re: CPU-Auslastung eines Prozesses
Da war Luckie wieder ein Tick schneller. grins
Ulrich |
Re: CPU-Auslastung eines Prozesses
Ich bin immer schneller. :mrgreen:
|
Re: CPU-Auslastung eines Prozesses
Wer lesen kann, ist... und vielleicht gibt's auch mal jmd, der schneller schreiben kann als Luckie ;)
Die Antwort ShellExecuteEx hätte mir gereicht, Ulrich. Hatte mich nur gewundert, weil ich es nur mit CreateProcess/OpenProcess und eben nicht mit (dem falsch gelesenen) ShellExecute hinbekommen habe... Freut mich, dass Dein Problem nun keins mehr ist! EDIT: Sag mal, gehörtest Du zu dieser Firma mit dem auffällig untechnischen Namen, nach dem ich mich auf der EKON beim Essen erkundigt habe? |
Re: CPU-Auslastung eines Prozesses
Hallo choose,
zu der Firma gehöre ich nicht. Damit kann ich nichts anfangen. Ulrich |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 Uhr. |
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