AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Check ob ein Programm nicht mehr reagiert
Thema durchsuchen
Ansicht
Themen-Optionen

Check ob ein Programm nicht mehr reagiert

Offene Frage von "Sereby"
Ein Thema von Sereby · begonnen am 27. Jan 2009 · letzter Beitrag vom 27. Jan 2009
Antwort Antwort
Sereby

Registriert seit: 31. Mär 2008
91 Beiträge
 
#1

Check ob ein Programm nicht mehr reagiert

  Alt 27. Jan 2009, 11:06
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#2

Re: Check ob ein Programm nicht mehr reagiert

  Alt 27. Jan 2009, 11:18
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Check ob ein Programm nicht mehr reagiert

  Alt 27. Jan 2009, 11:20
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Check ob ein Programm nicht mehr reagiert

  Alt 27. Jan 2009, 11:23
Cool. Windows hat das HalteProblem gelöst
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#5

Re: Check ob ein Programm nicht mehr reagiert

  Alt 27. Jan 2009, 11:24
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Check ob ein Programm nicht mehr reagiert

  Alt 27. Jan 2009, 11:29
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Check ob ein Programm nicht mehr reagiert

  Alt 27. Jan 2009, 11:39
@Luckie
Zitat von Nikolas:
Cool. Windows hat das HalteProblem gelöst :mrgreen:
Theoretische Informatik: Halteproblem


[edit] Link nachgereicht
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Check ob ein Programm nicht mehr reagiert

  Alt 27. Jan 2009, 11:47
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#9

Re: Check ob ein Programm nicht mehr reagiert

  Alt 27. Jan 2009, 12:08
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
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Sereby

Registriert seit: 31. Mär 2008
91 Beiträge
 
#10

Re: Check ob ein Programm nicht mehr reagiert

  Alt 27. Jan 2009, 12:34
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!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 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