Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Check ob ein Programm nicht mehr reagiert (https://www.delphipraxis.net/128277-check-ob-ein-programm-nicht-mehr-reagiert.html)

Sereby 27. Jan 2009 11:06


Check ob ein Programm nicht mehr reagiert
 
Hiho,

ich würde gerne überprüfen ob ein externes Programm noch reagiert oder nicht.
Nur weiss ich leider nicht so richtig wie ich da rangehen soll.

Das Handle hole ich mir zur zeit folgendermaßen:
Delphi-Quellcode:
function FindTask(ExeFileName: String): Integer;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  ExeFileName := UpperCase(ExeFileName);
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = ExeFileName) or
        (UpperCase(FProcessEntry32.szExeFile) = ExeFileName)) then
      Result := OpenProcess(PROCESS_TERMINATE,BOOL(0), FProcessEntry32.th32ProcessID);

     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;
Die funktion sollte eigentlich einen Task Killen aber die hab ich nur so kurz modifiziert dass ich das Handle erhalte, weil es mit findwindow irgendwie nicht ging :-/

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  hWindowHandle: HWND;
  Res,Err: Cardinal;
begin
  hWindowHandle := FindTask('Freezer.exe');
  if (hWindowHandle = 0) or (hWindowHandle = INVALID_HANDLE_VALUE) then Exit;

  Res := WaitForSingleObject(hWindowHandle,200);
  Err := GetLastError;

  ShowMessage(IntToStr(Res) + ': ' + SysErrorMessage(Res) + #13#10 + IntToStr(Err) + ': ' + SysErrorMessage(Err));
end;
GetLastError sagt nur Zugriff verweigert :(
Ich hoffe ihr könnt mich aufn richtigen weg schubsen!

MfG Sereby

himitsu 27. Jan 2009 11:18

Re: Check ob ein Programm nicht mehr reagiert
 
du könntest dem Programm eine nachticht per PostMessage(oder Verwandte) schicken

und das andere Programm schickt dir dann eine Antwort zurück ... kommt keine, dann ist da was eingefrohren.

Windows macht das (glaub ich) auch so.

Luckie 27. Jan 2009 11:20

Re: Check ob ein Programm nicht mehr reagiert
 
schicke die nachticht WM_NULL mittels der API-Funktion MSDN-Library durchsuchenSendMessageTimeout an das fenster der Anwendung. Über den TiomeOut kannst du selber entscheiden, nach welcher Zeit für dich das fenster als abgestürzt gelten soll.

@himitsu: PostMessage wäre etwas blöd. PostMessage stellt die Nachricht in die Nachrichtenschlange und kehrt sofort zurück. Richtige Lösung siehe oben.

Nikolas 27. Jan 2009 11:23

Re: Check ob ein Programm nicht mehr reagiert
 
Cool. Windows hat das HalteProblem gelöst :mrgreen:

himitsu 27. Jan 2009 11:24

Re: Check ob ein Programm nicht mehr reagiert
 
ich weiß, SendMessage/SendMessageTimeOut springt "sofort" ins Programm, aber was ist, wenn die bearbeitung der Nachrichtenschleife verreckt ist?

SendMessage ist doch unabhängig von diese Schleife ... oder wie war das? :gruebel:

Luckie 27. Jan 2009 11:29

Re: Check ob ein Programm nicht mehr reagiert
 
Was für ein Problem?

@himitsu: SendMessage(Timeout) liefert die Nachricht direkt bei der Fensterprozedur ab und wartet bis die Nachricht verarbeitet wurde. Wenn das Programm nicht mehr reagiert, kehrt SendMessageTimeout mit einem entsprechendem Fehlercode zurück, weil es die Nachricht nicht abliefern konnte. Wenn das Programm nicht mehr reagiert, dann werden auch keine Nachrichten abgeholt, das ist richtig. Aber das interessiert PostMessage nicht, da PostMessage die Nachricht in die Nachrichtenschlange stellt und sofort zurückkehrt. Die Nachrichtenschlage wird aber von Windows verwaltet und nicht vom Fenster.

Klaus01 27. Jan 2009 11:39

Re: Check ob ein Programm nicht mehr reagiert
 
@Luckie
Zitat:

Zitat von Nikolas
Cool. Windows hat das HalteProblem gelöst :mrgreen:

Theoretische Informatik: Halteproblem


[edit] Link nachgereicht
Grüße
Klaus

Luckie 27. Jan 2009 11:47

Re: Check ob ein Programm nicht mehr reagiert
 
Du hast vergessen den Link einzufügen. ;)

Nach kurzem überfliegen des Wikipediaartikels hat das nichts mit dem Problem zu tun. Letztendlich beobachte ich nur über einem bestimmten Zeitraum einen Zustand. Ändert sich der Zustand über einen definierten Zeitraum nicht, ziehe ich daraus meine Schlussfolgerung. Was ich nicht tue ist, ich entscheide nicht, ob der Zustand ewig daueren oder ob er sich nach einer bestimmten Zeit wieder ändern könnte.

Also wieder nur kindsches Microsoft Bashing.

himitsu 27. Jan 2009 12:08

Re: Check ob ein Programm nicht mehr reagiert
 
Zitat:

Aber das interessiert PostMessage nicht, da PostMessage die Nachricht in die Nachrichtenschlange stellt und sofort zurückkehrt.
das ist mir schon klar .. drum sagte ich ja, daß dann das andere Programm was zurücksenden müßte.

nja, er kann es ja erstma so probieren :angel:
Delphi-Quellcode:
Var hWindow: HWND;
  W: LongWord;
  isHungUp: Boolean;

hWindow := FindTask('Freezer.exe');
isHangUp := (hWindow <> 0) and (SendMessageTimeout(hWindow,
  WM_NULL, 0, 0, SMTO_ABORTIFHUNG, 5000, W) = 0);


INVALID_HANDLE_VALUE, im Zusammenhang mit Fenstern?

Sereby 27. Jan 2009 12:34

Re: Check ob ein Programm nicht mehr reagiert
 
vielen dank für die raschen infos.
allerdings funzt der eben erwähnte code leider nicht!

das Programm freezer.exe hat lediglich einen Button der auf Druck folgendes ausführt (endlosschleife)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  repeat
    Self.Visible := True;
  until (1 <> 1);
end;
in der titelleiste steht schon reagiert nicht und cpu auslatung is bei 50% aber isHungUp ist immer True!

edit:
Showmessage(SysErrorMessage(GetLastError));

gibt "Ungültiges Menühandle" wieder!


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz