![]() |
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 |
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; |
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 |
Re: WatchDog, Feststellen, das (fremdes Programm) hängt
Man könnte noch die Nachricht
![]() ![]() |
Re: WatchDog, Feststellen, das (fremdes Programm) hängt
Das stimmt. Aber kann kann doch in allen Schleifen ab und an ein 'Application.ProcessMessages' aufrufen.
|
Re: WatchDog, Feststellen, das (fremdes Programm) hängt
Entweder das oder einen separaten Thread benutzen.
|
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 |
Re: WatchDog, Feststellen, das (fremdes Programm) hängt
Zitat:
|
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. |
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 19:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz