Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Prüfen ob Programm abgestürzt ist (https://www.delphipraxis.net/177915-pruefen-ob-programm-abgestuerzt-ist.html)

iDope 5. Dez 2013 12:49

Prüfen ob Programm abgestürzt ist
 
Hallo zusammen,

Ich möchte ein Programm schreiben, welches ein Programm auf einem, im Netzwerk liegenden, Rechner auf Aktivität prüft.

Die WMI hab ich mir schonmal angeschaut. Hat jemand so etwas ähnliches schonmal gemacht oder hätte evtl Tipps wie oder wo ich diese "Rückmeldung" herbekommen könnte?

Der schöne Günther 5. Dez 2013 13:05

AW: Prüfen ob Programm abgestürzt ist
 
"Auf Aktivität prüfen" und "Prüfen, ob ein Prozess abstürzt" sind meiner Meinung nach zwei verschiedene Dinge. Was genau?

"Das Programm" das überprüft werden soll kann nicht modifiziert werden, oder?

Sherlock 5. Dez 2013 13:06

AW: Prüfen ob Programm abgestürzt ist
 
Ist das zu überprüfende Programm Dein eigenes? Wenn nein, verweise ich auf das Halteproblem. Falls ja, musst Du genau ermitteln, was für Kriterien einem Absturz entsprechen.

Sherlock

iDope 6. Dez 2013 08:45

AW: Prüfen ob Programm abgestürzt ist
 
Das zu überprüfende Programm ist nicht meines, somit kann es auch nicht modifiziert werden. Es soll überprüft werden ob, das Programm noch arbeitet oder ob es abgesürtzt ist und neu gestartet werden muss.

Vielen Dank (:

SirThornberry 6. Dez 2013 09:58

AW: Prüfen ob Programm abgestürzt ist
 
Wie definierst du abgestürzt?
1: Ist der Prozess noch aktiv aber das Programm reagiert nicht mehr?
2: Oder ist der Prozess geschlossen?
3: Hat das Programm ein Dienst oder hat es vielleicht sogar ein Hauptfenster welches man dann ansprechen könnte um zu sehen ob das Programm noch reagiert?

Luckie 6. Dez 2013 13:02

AW: Prüfen ob Programm abgestürzt ist
 
Besitzt der Prozess ein Fenster könnte man mit SendMessageTimeOut die Nachricht WM_NULL an das Fenster schicken. Oder guck mal hier: http://blogs.msdn.com/b/ntdebugging/...lications.aspx (Detecting and automatically dumping hung GUI based windows applications..) Den Debug-Kram kannst du ja weglassen.

taveuni 6. Dez 2013 14:19

AW: Prüfen ob Programm abgestürzt ist
 
Prüfen ob ein fremdes Programm abgestürzt ist - ist absolut unmöglich.
Diesbezüglich haben wir schon Mannmonate investiert und schlussendlich aufgegeben.

Wie oben schon jemand geschrieben hat geht es um die Kriterien. Ist ein Programm abgestürzt wenn:
Wenn nur das Fenster nicht mehr antwortet (Programm reagiert nicht mehr)-
kommt darauf an wie es programmiert ist. Wenn alles im Hauptthread abläuft - vergiss es.

Selbst wenn das Programm oder der Dienst eine Schnittstelle hat und einen Heartbeat sendet.
Was weiss der Überprüfer dann mehr? Nur dass der Heartbeat noch arbeitet.

iDope 6. Dez 2013 14:27

AW: Prüfen ob Programm abgestürzt ist
 
Okay, vielen Dank. Das SendmessageTimeout funktioniert zumindest mit méinem testprogramm. Ich werde es im lauzfe der nächsten Woche am eigentlichen Programm testen.

Olli73 6. Dez 2013 14:52

AW: Prüfen ob Programm abgestürzt ist
 
Schade! Ich hatte schon gehofft, dass hier ein zukünftiger Nobelpreisträger anwesend ist, der eine generelle Lösung anbieten kann. ;)

Furtbichler 6. Dez 2013 18:43

AW: Prüfen ob Programm abgestürzt ist
 
Auf dem lokalen PC kann man eine hängende Anwendung so erkennen:

Delphi-Quellcode:
function IsAppRespondingNT(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 IsAppResponding(Wnd: HWND): Boolean;
begin
 if not IsWindow(Wnd) then
 begin
   ShowMessage('Incorrect window handle');
 Exit;
 end;
 if Win32Platform = VER_PLATFORM_WIN32_NT then
   Result := IsAppRespondingNT(wnd)
 else
   Result := IsAppRespondingNT(GetWindowThreadProcessId(wnd,nil));
end;
Um das auf einem fremden PC umzusetzen, würde ich auf die Schnelle einen kleinen Dienst schreiben, der periodisch prüft, ob das Programm läuft und dann per TCP, Mail, UDP oder sonstwas Bescheid gibt, das was faul ist.

Käme auf einen Versuch an.

Leider ist die Funktion IsHungAppWindow nur für den internen Gebrauch und vielleicht auch gar nicht mehr so vorhanden.

Ich musste so einen Blödsinn mal schreiben, weil eine Anwendung aufgrund eines schrottigen Treibers manchmal abk*ckte und wir so wenigstens einen KillProcess-Versuch starten konnten. Letztendlich war das alles Blödsinn, aber es hat -soweit ich mich erinnern kann- funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr.
Seite 1 von 3  1 23      

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