Autor |
Beitrag |
F.Art
      
Beiträge: 434
|
Verfasst: Di 30.11.04 12:10
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure GetProcessList(sl: TStrings); var hProcSnap: THandle; pe32: TProcessEntry32; begin hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); if hProcSnap = INVALID_HANDLE_VALUE then exit; pe32.dwSize := SizeOf(TProcessEntry32); if Process32First(hProcSnap, pe32) = true then sl.Add(pe32.szExeFile); while Process32Next(hProcSnap, pe32) = true do sl.Add(pe32.szExeFile); CloseHandle(hProcSnap); end;
procedure TForm1.Button1Click(Sender: TObject); begin TaskListe.Clear; GetProcessList(TaskListe.Items); end; |
Mit diesem Code holle ich mir alle Prozesse in eine ListBox.
Ich möchte alle laufenden Prozesse scannen und wenn diese 100% auslastung haben diesen Task killen. Wer hat das hilfe für mich? Moderiert von Tino: Topic aus Sonstiges verschoben am Fr 03.12.2004 um 09:42
|
|
F.Art 
      
Beiträge: 434
|
Verfasst: Di 30.11.04 12:26
Ich habe folgendes noch gefunden.
Auflistung aller laufenden Prozesse
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure FillAppList(Applist: Tstrings); var Snap:THandle; ProcessE:TProcessEntry32; begin Applist.Clear; Snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); ProcessE.dwSize:=SizeOf(ProcessE); if Process32First(Snap,ProcessE) then begin Applist.Add(string(ProcessE.szExeFile)); while Process32Next(Snap,ProcessE) do Applist.Add(string(ProcessE.szExeFile)); end; CloseHandle(Snap); end;
procedure TForm1.Button1Click(Sender: TObject); begin TaskListe.Clear; EnumWindows(@EnumWinProc, Application.Handle); end; |
Es fehlt einfach noch das nacheinander auslesen der CPU auslastung und dann das Task killen, falls die auslastung zu hoch ist.
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Di 30.11.04 12:41
F.Art hat folgendes geschrieben: | Mit diesem Code holle ich mir alle Prozesse in eine ListBox. |
Unter NT4 wird CreateToolHelp32SnapShot nicht funktionieren. Da musst du EnumProcesses aus der Unit PsAPI benutzen. EnumProcesses funktioniert wiederum nicht mit Win9x. Außer die PSAPI.DLL wurde von irgendeinem Programm installiert.
Zitat: | Ich möchte alle laufenden Prozesse scannen und wenn diese 100% auslastung haben diesen Task killen. Wer hat das hilfe für mich? |
OpenProcess und TerminateProcess sind deine Freunde.
_________________ Ciao, Sprint.
|
|
F.Art 
      
Beiträge: 434
|
Verfasst: Di 30.11.04 13:00
Es soll nur unter es soll nur unter Win XP, Server 2000 und Server 2003 laufen.
Ich könnte noch einige Sources gebrauchen.
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Di 30.11.04 13:10
_________________ Ciao, Sprint.
|
|
Raphael O.
      
Beiträge: 1596
VS 2013
|
Verfasst: Di 30.11.04 13:15
gibt bei Delphigl.com zufällig auch grad das Thema und da ist dieser Link gefallen:
die beschreibung oben klingt vielversprechend und man sollte was rausholen können
www.planet-source-co...lngWid!7/anyname.htm
|
|
F.Art 
      
Beiträge: 434
|
Verfasst: Di 30.11.04 13:28
Also dieser Threat www.planet-source-co...lngWid!7/anyname.htm ist mir zu mächtig.
Und das mit dem Taskkilen funktioniert gut. Nun müsste nur gecheckt werden bei was für einen CPU auslastung dieser Task ist.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 30.11.04 14:22
Sprint hat folgendes geschrieben: | Mal ein kleines Beispiel für OpenProcess und TerminateProcess. Hab den Klassiker Notepad genommen.
Delphi-Quelltext 1: 2:
| if TerminateProcess(ProcessHandle, 0) then ShowMessage('Prozess wurde erfolgreich beendet.'); | |
Das geht so nicht. Bzw. wirst du da immer True erhalten. Im PSDK steht zwar:
Zitat: |
If the function succeeds, the return value is nonzero.
|
Aber:
Zitat: |
TerminateProcess initiates termination and returns immediately.
|
Ersteres bezieht sich nur auf den Funktionsaufruf, nicht auf die Tatsache, ob der Prozess auch tatsächlich beendet wurde.
Jeffrey Richter schreibt dazu:
Zitat: |
Die Funktion TerminateProcess arbeitet asynchron, d. h. sie teilt dem Betriebssystem mit, dass der Prozess beendet werden soll, kehrt jedoch zurück, bevor der Prozess tatsälich beendet wurde.
|
Um wirklich sicher zu gehen, sollte man mit WaitForSingleObject prüfen:
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 KillProcess(dwProcID: DWORD); var hProcess : Cardinal; dw : DWORD; begin hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, dwProcID); TerminateProcess(hProcess, 0); dw := WaitForSingleObject(hProcess, 5000); case dw of WAIT_OBJECT_0: Messagebox(Application.Handle, 'Prozess wurde beendet.', 'Prozess beenden', MB_ICONINFORMATION); WAIT_TIMEOUT: begin Messagebox(Application.Handle, 'Prozess konnte nicht innerhalb von 5 Sekunden beendet werden.', 'Prozess beenden', MB_ICONSTOP); exit; end; WAIT_FAILED: begin RaiseLastOSError; exit; end; end; Form1.Button1Click(Form1); end; |
Das muss ich auch noch mal überarbeiten. Hardgecodete Strings, keine Funktion mit Rückgabewert, ... 
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Di 30.11.04 15:30
_________________ Ciao, Sprint.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 30.11.04 15:33
Ich habe es jetzt mal neu geschrieben:
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:
| function KillProcess(ProcID: DWORD; TimeOut: DWORD): Integer; var retValue : Integer; hProcess : Cardinal; dw : DWORD; begin retValue := 0; hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or SYNCHRONIZE or PROCESS_TERMINATE, False, ProcID); if hProcess <> INVALID_HANDLE_VALUE then begin if TerminateProcess(hProcess, 0) then begin dw := WaitForSingleObject(hProcess, TimeOut); case dw of WAIT_OBJECT_0: retValue := 0; WAIT_TIMEOUT: retValue := -1; WAIT_FAILED: retValue := GetLastError; end; end else retValue := GetLastError; Closehandle(hProcess); end else retValue := GetLastError; result := retValue; end; |
|
|
F.Art 
      
Beiträge: 434
|
Verfasst: Di 30.11.04 18:14
Wie kann ich bei dem letzten Code ein Task killen bzw die function aufrufen?
|
|
Basti
      
Beiträge: 345
Windows Vista
D2005 Pers, D7 Pers
|
Verfasst: Di 30.11.04 19:51
Titel: CPU Auslastung eines Prozesses
Hey Leute, ich habe das gleiche Problem mit der prozentualen Auslastung eines Prozesses.
Unter dem Link gab es zwar den netten Code, aber die Auslastung hat der mir auch nicht angegeben
Gibt's da nicht noch eine Möglichkeit?
_________________ Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Di 30.11.04 20:11
bei mir ist immer LEERLAUFPROZESS mit 99% Auslastung, unten steht aber gesamtauslastung
0%, kann es sein, das immer eine gewisse Auslastung da sein muss ???
Kann mich irren (irren ist menschlich  )
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Di 30.11.04 20:16
Ich würd sagen, die Auslastung von 100% wird immer auf die einzelnen Prozesse verteilt; und wenn eben nichts läuft, bekommt der Leerlaufprozess diese 100%.
Zeigt auch jeder bessere Taskmanager so an, zB ProcessExplorer NT von www.sysinternals.com
AXMD
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Di 30.11.04 20:19
Titel: Re: CPU Auslastung eines Prozesses
Basti hat folgendes geschrieben: | Gibt's da nicht noch eine Möglichkeit? |
Um die Prozessorauslastung für jeden einzelnen Prozess zu ermitteln, habe ich bis jetzt nur Beispiel in Verbindung mit Performance Monitor bzw. PerfMon gesehen. Und ich glaube nicht das du dich da wirklich mit beschäftigen willst.
_________________ Ciao, Sprint.
|
|
F.Art 
      
Beiträge: 434
|
Verfasst: Mi 01.12.04 10:23
Naj ich muß mich damit beschäftigen und will schritt für schritt an die lösung kommen.
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Mi 01.12.04 10:41
Luckie hat folgendes geschrieben: | Ich habe es jetzt mal neu geschrieben:
Delphi-Quelltext 1: 2: 3: 4:
| hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or SYNCHRONIZE or PROCESS_TERMINATE, False, ProcID); if hProcess <> INVALID_HANDLE_VALUE then begin if TerminateProcess(hProcess, 0) then | |
OpenProcess gibt den Wert 0 zurück, falls die Funktion fehlschlägt. Und kein INVALID_HANDLE_VALUE wie in deinem Beispiel.
_________________ Ciao, Sprint.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 01.12.04 10:58
|
|