Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi WatchDog, Feststellen, das (fremdes Programm) hängt (https://www.delphipraxis.net/122731-watchdog-feststellen-das-fremdes-programm-haengt.html)

hoika 21. Okt 2008 08:34


WatchDog, Feststellen, das (fremdes Programm) hängt
 
Hallo,

ein Programm A von mir läuft den ganzen Tag (kein Dienst) und liest Daten aus einem externen Gerät aus.
Ein Programm B checkt (über geplante Vorgänge) permanent,
ob Programm A noch läuft und startet es bei Bedarf neu.
(Der Test läuft über einen Mutex, den Programm A erzeugt).

Jetzt kann (soll aber nicht ;) ) es vorkommen,
das Programm A "hängt".
Die Meldung von Windows ist ja dann "Das Programm XXX reagiert nicht mehr"

Kann ich sowas selber feststellen, und es dann abschiessen ?
Gibt es dafür einen API-Befehl ?


Danke


Heiko

alzaimar 21. Okt 2008 08:40

Re: WatchDog, Feststellen, das (fremdes Programm) hängt
 
Hab ich mal irgendwo ausgeschnipselt, aber nie benutzt:
Delphi-Quellcode:
// For Win NT/2000/XP
function IsAppRespondigNT(wnd: HWND): Boolean;
type
  TIsHungAppWindow = function(wnd:hWnd): BOOL; stdcall;
var
  hKernel: THandle;
  IsHungAppWindow: TIsHungAppWindow;
begin
  Result := True;
  hKernel := GetModuleHandle('user32.dll');
  if (hKernel > 0) then
  begin
    @IsHungAppWindow := GetProcAddress(hKernel, 'IsHungAppWindow');
    if Assigned(IsHungAppWindow) then
    begin
      Result := not IsHungAppWindow(wnd);
    end;
  end;
end;

function IsAppRespondig(Wnd: HWND): Boolean;
begin
 if not IsWindow(Wnd) then
 begin
   ShowMessage('Incorrect window handle');
 Exit;
 end;
 if Win32Platform = VER_PLATFORM_WIN32_NT then
   Result := IsAppRespondigNT(wnd)
 else
   Result := IsAppRespondigNT(GetWindowThreadProcessId(wnd,nil));
end;

Sherlock 21. Okt 2008 08:44

Re: WatchDog, Feststellen, das (fremdes Programm) hängt
 
Ist aber nicht unbedingt zuverlässig. Wenn eine Applikation mal eben bisschen was zu "rödeln" hat, dann verarbeitet sie halt grad keine Messages und schon ist sie eine "Hung Application". Das ist halt ein klassisches Problem der Informatik: Von aussen Feststellen, ob eine beliebige Anwendung auch noch macht, was sie machen soll...

Aber ein Hinweis ist es auf jeden Fall.

Sherlock

Luckie 21. Okt 2008 08:49

Re: WatchDog, Feststellen, das (fremdes Programm) hängt
 
Man könnte noch die Nachricht MSDN-Library durchsuchenWM_NULL mit MSDN-Library durchsuchenSendMessageTimeout an das Fenster senden. das ist, glaube ich, auch die Methode die vom Taskmanager verwendet wird, um festzustellen, ob ein Fenster noch reagiert.

alzaimar 21. Okt 2008 08:52

Re: WatchDog, Feststellen, das (fremdes Programm) hängt
 
Das stimmt. Aber kann kann doch in allen Schleifen ab und an ein 'Application.ProcessMessages' aufrufen.

Luckie 21. Okt 2008 08:56

Re: WatchDog, Feststellen, das (fremdes Programm) hängt
 
Entweder das oder einen separaten Thread benutzen.

Sherlock 21. Okt 2008 09:11

Re: WatchDog, Feststellen, das (fremdes Programm) hängt
 
Nur nützt ein Application.ProcessMessages in einer Endlosschleife auch nicht wirklich viel ;)
Das Programm hängt eigentlich, aber für Windows sieht es intakt aus...

Sherlock

alzaimar 21. Okt 2008 09:13

Re: WatchDog, Feststellen, das (fremdes Programm) hängt
 
Zitat:

Zitat von Sherlock
Nur nützt ein Application.ProcessMessages in einer Endlosschleife auch nicht wirklich viel ;)

:oops: hö hö. Es gibt bei mir keine Endlosschleife.

nahpets 21. Okt 2008 09:27

Re: WatchDog, Feststellen, das (fremdes Programm) hängt
 
Hallo,

Vorschlag für eine "halb manuelle" Prüfung:
An definierten Stellen des zu überprüfenden Programmes eine Textdatei mit Zeitstempel erstellen und die Änderung dieser Datei mit dem Überwachungsprogramm prüfen.

Bei einem Kunden mit aufwändigen Datenbankapplikationen (unter AIX) haben wir die Programme an definierten Stellen in eine Datenbanktabelle den Programmnamen, einen Zeitstempel und den gerade auszuführenden Programmschritt schreiben lassen. Dadurch konnten wir in dieser Tabelle immer sehen, welcher Job gerade was macht und an welcher Stelle er ggfls. hängengeblieben ist. Diese Überprüfung erfolgte mittels eines Programmes, dass den Admin ggfls. bei Langläufern informierte. Hier braucht man ggfls. Erfahrungswerte, wie lange ein Job wofür brauchen darf, und ab wann eine Warnung zu senden ist.

Dies läßt sich sicherlich auch auf einen automatischen Programmabbruch und Neustart erweitern.

hoika 21. Okt 2008 09:38

Re: WatchDog, Feststellen, das (fremdes Programm) hängt
 
Hallo,

danke an alle für die vielen Antworten ! :-D

Die Sache mit dem TimeStamp in die DB schreiben,
hatte ich mir auch schon überlegt.

Donnerstag ist Abgabe, *schnell tipper*


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 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