Entwickler-Ecke
Windows API - Auslastung einzelner Prozesse
Harry M. - Sa 13.08.05 18:34
Titel: Auslastung einzelner Prozesse
Kennt jemand eine Function zum ermitteln der CPU-Auslastung einzelner Prozesse?
uall@ogc - Sa 13.08.05 18:51
ich glaub du bist schon lang genu hier um zu weissen das man vorher die suche verwenden soll
ich hab eben nach "CPU Aulastung gesucht" und die lösung gefunden
da du zu faul warst werd ich dir das aber net sagen
Harry M. - Sa 13.08.05 18:53
Ich habe über 3 Stunden gesucht!!! Es geht aber immer nur darum wie man die gesamte Auslastung ermittelt. Die einzelner Prozesse wurde nie abschliessend geklärt.
Harry M. - Sa 13.08.05 19:24
Ne will ich nicht. Und ich finde es auch nach Deiner Beschreibung nicht. Hab ich was mit den Augen?? Poste doch mal bitte den Direktlink.
Harry M. - Sa 13.08.05 19:26
Habe ich mir angesehen. Wie ich da aber an die Auslastung einzelner Processe komme will mir nicht einleuchten.
Delete - So 14.08.05 23:15
In dem du dir das Programm von Olli mal anguckst.
retnyg - So 14.08.05 23:21
Luckie hat folgendes geschrieben: |
| In dem du dir das Programm von Olli mal anguckst. |
wobei bei der fertig kompilierten exe von olli aka assarbad keine cpu-last zu sehen ist o0
Delete - So 14.08.05 23:28
Ich habe mich da auf die Aussage von GoP verlassen. ;)
Harry M. - Mo 15.08.05 02:15
@Luckie Du müssets mich doch schon so gut kennen das Du weißt, das ich das getan habe - es will aber nicht. Was ich zustande gebracht habe hänge ich mal dran aber das pe32.cntUsage gibt nicht den richtigen wert zurück.
Delete - Mo 15.08.05 02:38
Weil vntusage nicht die Prozessauslastung ist:
| PSDK hat folgendes geschrieben: |
cntUsage
Number of references to the process. A process exists as long as its usage count is nonzero. As soon as its usage count becomes zero, a process terminates.
|
Delphi-Quelltext
1: 2:
| hKernel := GetModuleHandle('KERNEL32.DLL'); |
Warum wohl? Weil die DLL elementare Funktionen bereitstellt, ohne die ein Prozess nicht erzeugt werden kann. Der rsets ieht auch ziemlcih abenteuerlich aus:
Delphi-Quelltext
1: 2: 3: 4: 5:
| IF BOOL(hKernel) THEN BEGIN @CreateToolhelp32Snapshot := GetProcAddress(hKernel, 'CreateToolhelp32Snapshot'); @Process32First := GetProcAddress(hKernel, 'Process32First'); @Process32Next := GetProcAddress(hKernel, 'Process32Next'); END; |
Warum der Cast nach BOOL? Wie wäre es mit:
if hKernel <> 0 then Und warum lädst du die dynamisch im Code? Hat das einen Grund? Ist doch schon alles in der TlHelp32.pas deklariert und importiert.
Delphi-Quelltext
1:
| if hProcessSnap = DWORD(-1) then exit; |
Es gibt auch eine Konstante für diesen Ausdruck: INVALID_HANDLE_VALUE.
Delphi-Quelltext
1:
| pe32.dwSize := sizeof(tagPROCESSENTRY32); |
Ein
ZeroMemory(@pe32, sizeof(tagProcessEntry32)); davor könnte auch nicht schaden.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| function TransPri(I: Integer): string; begin RESULT := 'Normal';
case I of 11: RESULT := 'Hoch'; end; end; |
Es gibt mehr als zwei Prozessprioritäten.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure GetProcessInfo(ProcList: TListView); var hProcessSnap : DWORD; pe32 : TProcessEntry32; noerr : bool; S : string; ProcessHandle : THandle; begin hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if hProcessSnap <> INVALID_HANDLE_VALUE then begin ZeroMemory(@pe32, sizeof(tagProcessEntry32)); pe32.dwSize := sizeof(tagPROCESSENTRY32); noerr := Process32First(hProcessSnap, pe32); while noerr do begin ProcList.Items.Add.Caption := pe32.szExeFile; ProcList.Items.Item[ProcList.Items.Count - 1].SubItems.Add(IntToStr(pe32.th32ProcessID)); ProcList.Items.Item[ProcList.Items.Count - 1].SubItems.Add(IntToStr(pe32.cntUsage)); ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pe32.th32ProcessID); S := ' '; if ProcessHandle <> 0 then begin SetLength(S, MAX_PATH); SetLength(S, GetModuleFileNameEx(ProcessHandle, 0, PChar(S), Length(S))); CloseHandle(ProcessHandle); end; ProcList.Items.Item[ProcList.Items.Count - 1].SubItems.Add(S); ProcList.Items.Item[ProcList.Items.Count - 1].SubItems.Add(IntToStr(pe32.cntThreads)); ProcList.Items.Item[ProcList.Items.Count - 1].SubItems.Add(TransPri(pe32.pcPriClassBase)); noerr := Process32Next(hProcessSnap, pe32); end; CloseHandle(hProcessSnap); end; end; |
Davon mal abgesehen, würde ich den Code sowieso von der GUI trennen.
Siehe dazu:
http://www.luckie-online.de/Developer/Delphi/Sonstiges/Prozessliste.html
und
http://www.luckie-online.de/Developer/Delphi/Sonstiges/ProcList_KillProc.html
Harry M. - Mo 15.08.05 04:25
Der Code der DIr ao abendteulich anmutet ist nicht mal von mir ;-) ist von Olli. Und ich weis auch, das es mehr als 2 Prioritäten gibt. Das was ich hochgeladen habe war nur ein kleines Beispielprogramm womit ich grad versuche das rauszukriegen.
Wenn cntUsage das nicht die Auslastung ist, wie kann ich sie denn damm ermitteln?
Delete - Mo 15.08.05 10:26
Harry M. hat folgendes geschrieben: |
| Der Code der DIr ao abendteulich anmutet ist nicht mal von mir ;-) ist von Olli. |
Wenn wir den gleichen Olli meinen, kann ich das nicht so ganz glauben. Der hätte bestimmt nicht den Code derartiug mit der GUI verknüpft.
Harry M. - Mo 15.08.05 10:28
nein ich rede von dem hier
Delphi-Quelltext
1: 2: 3: 4: 5:
| IF BOOL(hKernel) THEN BEGIN @CreateToolhelp32Snapshot := GetProcAddress(hKernel, 'CreateToolhelp32Snapshot'); @Process32First := GetProcAddress(hKernel, 'Process32First'); @Process32Next := GetProcAddress(hKernel, 'Process32Next'); END; |
Delete - Mo 15.08.05 10:32
Ja das kann sein, aber dann hat er bestimmt nicht die Units eingebunden.
Harry M. - Mo 15.08.05 10:34
Ne.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!