Autor Beitrag
F.Art
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: Di 30.11.04 12:10 
ausblenden 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 user profile iconTino: Topic aus Sonstiges verschoben am Fr 03.12.2004 um 09:42
F.Art Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: Di 30.11.04 12:26 
Ich habe folgendes noch gefunden.

Auflistung aller laufenden Prozesse

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Di 30.11.04 13:10 
Mal ein kleines Beispiel für OpenProcess und TerminateProcess. Hab den Klassiker Notepad genommen. :)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
var
  AppHWnd: HWND;
  ProcessHandle: THandle;
  ProcessId: DWORD;
begin

  AppHWnd := FindWindow('Notepad'nil);
  if IsWindow(AppHWnd) then
  begin
    if GetWindowThreadProcessId(AppHWnd, ProcessId) <> 0 then
      if ProcessId <> 0 then
      begin
        ProcessHandle := OpenProcess(PROCESS_TERMINATE, False, ProcessId);
        if ProcessHandle <> 0 then
          if TerminateProcess(ProcessHandle, 0then
            ShowMessage('Prozess wurde erfolgreich beendet.');
      end;
  end;

end;

_________________
Ciao, Sprint.
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: 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



BeitragVerfasst: Di 30.11.04 14:22 
Sprint hat folgendes geschrieben:
Mal ein kleines Beispiel für OpenProcess und TerminateProcess. Hab den Klassiker Notepad genommen. :)
ausblenden Delphi-Quelltext
1:
2:
          if TerminateProcess(ProcessHandle, 0then
            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:
ausblenden volle Höhe 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 KillProcess(dwProcID: DWORD);
var
  hProcess : Cardinal;
  dw       : DWORD;
begin
  { open the process and store the process-handle }
  hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, dwProcID);
  { kill it }
  TerminateProcess(hProcess, 0);
  { TerminateProcess returns immediately, so wie have to verify the result via
    WaitForSingleObject }

  dw := WaitForSingleObject(hProcess, 5000);
  case dw of
    { everythings's all right, we killed the process }
    WAIT_OBJECT_0: Messagebox(Application.Handle, 'Prozess wurde beendet.''Prozess beenden',
      MB_ICONINFORMATION);
    { process could not be terminated after 5 seconds }
    WAIT_TIMEOUT:
    begin
      Messagebox(Application.Handle, 'Prozess konnte nicht innerhalb von 5 Sekunden beendet werden.',
        'Prozess beenden', MB_ICONSTOP);
      exit;
    end;
    { error in calling WaitForSingleObject }
    WAIT_FAILED:
    begin
      RaiseLastOSError;
      exit;
    end;
  end;
  { and refresh listbox contend }
  Form1.Button1Click(Form1);
end;

Das muss ich auch noch mal überarbeiten. Hardgecodete Strings, keine Funktion mit Rückgabewert, ... :roll:
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Di 30.11.04 15:30 
Luckie hat folgendes geschrieben:
Sprint hat folgendes geschrieben:
Mal ein kleines Beispiel für OpenProcess und TerminateProcess. Hab den Klassiker Notepad genommen. :)
ausblenden Delphi-Quelltext
1:
2:
          if TerminateProcess(ProcessHandle, 0then
            ShowMessage('Prozess wurde erfolgreich beendet.');

Das geht so nicht.

In meinem Beispiel geht das 100%ig so. Weil ich keine Security Rights setze. Somit bekomme ich auch kein ProcessHandle wenn ich nicht das Recht habe den Prozess zu beenden. Sinnvoller wäre gewesen, wenn ich die Abfrage änders gesetzt hätte.

Zitat:
Bzw. wirst du da immer True erhalten.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
  if TerminateProcess(1230then
    ShowMessage('Luckie hat recht.')
  else
    ShowMessage('Luckie hat unrecht.');


Besser wäre wenn du Anhand eines Beispiels das mal zeigen würdest, wie man nachvollziehen kann wie es mit TerminateProcess nicht geht.
Ich kann mir das höchstens vorstellen, wenn man unter Windows 9x einen Prozess abschießt und Windows denkt das er ihn auch beendet hat und dieser zwar immer noch irgendwie läuft. Aber unter Garantie hängt das Ding dann.

_________________
Ciao, Sprint.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 30.11.04 15:33 
Ich habe es jetzt mal neu geschrieben:
ausblenden 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, 0then
    begin
      dw := WaitForSingleObject(hProcess, TimeOut);
      case dw of
        WAIT_OBJECT_0: retValue := 0;
        WAIT_TIMEOUT: retValue := -1;
        WAIT_FAILED: retValue := GetLastError;
      end;
    end
    else // TerminateProcess failed
      retValue := GetLastError;
    Closehandle(hProcess);
  end
  else // OpenProcess failed
    retValue := GetLastError;
  result := retValue;
end;
F.Art Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: Di 30.11.04 18:14 
Wie kann ich bei dem letzten Code ein Task killen bzw die function aufrufen?
Basti
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 345

Windows Vista
D2005 Pers, D7 Pers
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Mi 01.12.04 10:41 
Luckie hat folgendes geschrieben:
Ich habe es jetzt mal neu geschrieben:
ausblenden 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, 0then


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



BeitragVerfasst: Mi 01.12.04 10:58 
Ach Mist. Blöde inkonsistente API:
ausblenden Quelltext
1:
2:
3:
4:
5:
HANDLE OpenProcess(
  DWORD dwDesiredAccess,
  BOOL bInheritHandle,
  DWORD dwProcessId
);

:roll: