![]() |
Problem mit Auslastung durch je. Prozesse - GetProcessMemory
Mein Problem ist folgendes: Ich habe eine Liste aller Prozesse (aaa.exe, bbb.exe, etc.). Nun will ich die jeweilige Auslastung mit GetProcessMemoryInfo() der PSAPI ermitteln. Das mach ich wie folgt:
Delphi-Quellcode:
Die Funktion GetWH ( -> getwindowhandle) sieht so aus:
procedure TForm1.FormCreate(Sender: TObject);
VAR List1 : TStringList; i : integer; Item : TListItem; Test : PPROCESS_MEMORY_COUNTERS; temp : THandle; begin List1 := TStringlist.Create; for i := 0 to List1.Count-1 do begin Item := ListView1.Items.Add; Item.Caption := List1.Strings[i]; IF GetProcessMemoryInfo(GetWH(List1.Items[i]), Test, SizeOf(Test)) THEN //<- IMMER FALSE! Item.SubItems.Add(IntToStr(Test^.PeakWorkingSetSize)); end;
Delphi-Quellcode:
Leider wird mir nichts zurück-geliefert, da die IF-Anweisung immer false ergibt.
function GetWH(AExeName: string): THandle;
var SnapShot: THandle; p: TProcessEntry32; ProcessHandle: THandle; begin Result := 0; WindowHandle := 0; ProcessHandle := 0; p.dwSize := SizeOf(p); SnapShot := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0); try if Process32First(SnapShot, p) then repeat if AnsiLowerCase(AExeName) = AnsiLowerCase(p.szExeFile) then ProcessHandle := p.th32ProcessID; until (ProcessHandle <> 0) or not Process32Next(SnapShot, p); EnumWindows(@MyEnumWindowProc, ProcessHandle); Result := WindowHandle; finally CloseHandle(SnapShot); end; end; |
Re: Problem mit Auslastung durch je. Prozesse - GetProcessMe
Also erstmal ist ein Prozesshandle nicht das gleiche wie eine Prozess-ID.
Außerdem übergibst du, wie ich das sehe ein Fensterhandle?!! (Statt Prozesshandle) EDIT: Sorry nein, du übergibst natürlich IMMER 0 als Prozesshandle, weil die Funktion immer 0 zurückgibt, wie es für mich aussieht. Erklär mal den Sinn der Funktion und zeig den Code der Callback-Funktion für EnumWindows(). |
Re: Problem mit Auslastung durch je. Prozesse - GetProcessMe
ok, wer lesen kann ist klar im Vorteil. Gesucht ist das process-handle (danke das du mich drauf aufmerksam gemacht hast :-) )! Das bekomme ich jetzt zwar raus, weiter bringts mich trotzdem nicht...
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
VAR List1 : TStringList; i : integer; Item : TListItem; Test : PPROCESS_MEMORY_COUNTERS; ID : DWord; Temp : THandle; begin List1 := TStringList.Create; GetProcessList(List1); for i := 0 to List1.Count-1 do begin Item := ListView1.Items.Add; Item.Caption := List1.Strings[i]; GetWindowThreadProcessId(GetWH(List1.Strings[i]), ID); //GetWH bekommt das WindowHandl Temp := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ID); IF GetProcessMemoryInfo(Temp, Test, SizeOf(Test)) THEN Item.SubItems.Add(IntToStr(Test.PeakWorkingSetSize)); end; end; function GetWH(AExeName: string): THandle; var SnapShot: THandle; p: TProcessEntry32; ProcessHandle: THandle; begin Result := 0; WindowHandle := 0; ProcessHandle := 0; p.dwSize := SizeOf(p); SnapShot := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0); try if Process32First(SnapShot, p) then repeat if AnsiLowerCase(AExeName) = AnsiLowerCase(p.szExeFile) then ProcessHandle := p.th32ProcessID; until (ProcessHandle <> 0) or not Process32Next(SnapShot, p); EnumWindows(@MyEnumWindowProc, ProcessHandle); Result := WindowHandle; finally CloseHandle(SnapShot); end; end; function MyEnumWindowProc(AHandle: THandle; LParam: LongWord): boolean; stdcall; var ProcessID: THandle; begin ProcessID := 0; GetWindowThreadProcessID(AHandle, ProcessID); Result := not (ProcessID = LParam); if not Result then WindowHandle := AHandle; end; Klappen tut es trotzdem nicht :gruebel: |
Re: Problem mit Auslastung durch je. Prozesse - GetProcessMe
Zitat:
Nenn mich doof, aber:
Code:
...diese Funktion gibt immernoch *immer* 0 zurück.
function GetWH(AExeName: string): THandle;
var SnapShot: THandle; p: TProcessEntry32; ProcessHandle: THandle; begin Result := 0; [color=red] WindowHandle := 0;[/color] ProcessHandle := 0; p.dwSize := SizeOf(p); SnapShot := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0); try if Process32First(SnapShot, p) then repeat if AnsiLowerCase(AExeName) = AnsiLowerCase(p.szExeFile) then ProcessHandle := p.th32ProcessID; until (ProcessHandle <> 0) or not Process32Next(SnapShot, p); EnumWindows(@MyEnumWindowProc, ProcessHandle); [color=red] Result := WindowHandle;[/color] finally CloseHandle(SnapShot); end; end; Kannst du also auch als
Delphi-Quellcode:
...schreiben. Ist exakt das gleiche, geht aber schneller.
function GetWH(AExeName: string): THandle;
begin Result := 0; end; |
Re: Problem mit Auslastung durch je. Prozesse - GetProcessMe
Sch*****, du hast recht, es klappt nicht. Hab zwar oben meinen Eintrag korrigiert, liefert aber immer 0 zurück! Hab das hier benutzt um das Handle zu bekommen - >
![]() |
Re: Problem mit Auslastung durch je. Prozesse - GetProcessMe
Darf ich mal fragen, woher du die Liste der Prozeßnamen hast? Die mußt du doch auch irgendwie bekommen. Warum mußt du also überhaupt diesen umständlichen Weg über ein Fensterhandle gehen.
Erklär mal dein Ziel. |
Re: Problem mit Auslastung durch je. Prozesse - GetProcessMe
OK, spiele gerade mit Prozessen rum. Mein Ziel ist es "The GetProcessMemoryInfo function retrieves information about the memory usage of the specified process", dass herauszubekommen - die MemoryUsage. Das erhoffe ich mir durch GetProcessMemoryInfo. Dass wird dann in einer ListView - Kolumne neben dem Process-Name und der ID angezeigt. Die Programme werden also erst in ne StringList (klappt) geladen, dann jedes einzelne in die ListView geladen, dann hol ich mir dadurch die Prozess-ID (klappt auch) und dann sollte halt die Auslastun kommen....
Wie, umständlichen Weg über Fensterhandle? Ich dachte das geht nicht anders. Ich benutze ja GetProcessMemoryInfo, dafür brauch ich am Anfang erst OpeProcess für Temp ( : THandle). Für OpenProcess benötige ich die ProcessID, die ich durch GetWindowThreadProcessId bekomme und dafür brauch ich dann am Ende das Window Handle! |
Re: Problem mit Auslastung durch je. Prozesse - GetProcessMe
Zitat:
Verstehste?! |
Re: Problem mit Auslastung durch je. Prozesse - GetProcessMe
Moin moin,
Zitat:
Delphi-Quellcode:
Evtl. kommste damit ein Sück weiter?!
//...
var ErrorMessage : array[0 .. 256] of Char; //... begin //... IF GetProcessMemoryInfo(Temp, Test, SizeOf(Test)) THEN Item.SubItems.Add(IntToStr(Test.PeakWorkingSetSize)) else begin FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, GetLastError, 0, @ErrorMessage, Sizeof(ErrorMessage) - 1, nil); ShowMessage(ErrorMessage); end; //... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:00 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