Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wie finde ich heraus, ob ein Prozess sich aufgehangen hat? (https://www.delphipraxis.net/174350-wie-finde-ich-heraus-ob-ein-prozess-sich-aufgehangen-hat.html)

Der schöne Günther 18. Apr 2013 13:00

Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?
 
Das ist eigentliche eine Frage, wie Ihr sie sicherlich schon 100 mal gehört habt. Ich bekomme es noch nicht einmal auf die Reihe, die Antwort zu finden. :pale:

Das einzige, was ich bislang gefunden habe, ist mittels GetExitCodeThread den Hauptthread des gestarteten Prozesses zu überprüfen. Entweder er liefert
Delphi-Quellcode:
STILL_ACTIVE
oder halt den Wert mit dem er sich beendet hat.

Aber das kann doch nicht schon alles sein? Ein paar Messages in den Raum werfen und irgendwie versuchen zu schauen, ob ein Fenster der Anwendung ihre Message Loop noch abholt?

Ich stehe auf dem Schlauch. Ich möchte im gleichen Thread, der den auch Prozess mittels
Delphi-Quellcode:
CreateProcess
selbst aufgemacht hat, später auch schauen können, wie es ihm geht. Und einfach nur zu wissen, ob der Hauptthread noch läuft kann sicher nicht schon alles sein.

Aphton 18. Apr 2013 13:49

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?
 
Warum willst du das wissen? Vlt kann man das Hauptproblem ja anders lösen.

Der schöne Günther 18. Apr 2013 13:53

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?
 
Der Benutzer startet den Prozess B über Prozess A (mein Programm) und Prozess B hat durchaus Wahrscheinlichkeiten, irgendwann auszusteigen. Freundlich beenden und notfalls rabiat abschießen ist alles kein Problem.

Ich möchte nur dem Benutzer auch sagen können "Lasset alle Hoffnung fahren, da rührt sich so schnell nichts mehr".


Hört sich schrecklich an, aber dass ich mit CreateProcess eine andere Anwendung starte, wissen will, wie es ihr geht und sie auch selbst wieder schließe - Daran ist nichts zu rütteln ;-)

Aphton 18. Apr 2013 13:58

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?
 
Also nicht reagiert heißt nicht, dass das Programm abgestürtzt ist, von daher müsstest du höchstens das über Timeouts lösen.

Im Falle eines Absturzes würde ich die gestartete Anwendung einfach debuggen und kucken, ob es zu einer unbehandelten Exception im Prozess gekommen ist.. Falls ja, erwürgen!

Der schöne Günther 18. Apr 2013 14:02

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?
 
Der Punkt ist nur, auf den gestarteten Prozess habe ich relativ wenig Einfluss, das ist mehr von einem Drittanbieter. Keine Ahnung, was der da ausliefert.

Also außer dem Prozess Messages zuwerfen und wenn ich hierauf nach einer Weile immer noch keine Antwort erhalten habe geht da nicht mehr viel?

Das mit dem Debuggen verstehe ich nicht - Kann ich herausfinden, was in einem vollkommen anderen Prozess für Exceptions vorkommen?

baumina 18. Apr 2013 14:05

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?
 
Ich befürchte das weiß oft Windows selbst nicht so recht, denn auch Programme, die im Taskmanager als "Anwendung reagiert nicht" stehen, leben oft doch noch. Das sind Anwendungen, die an einer Stelle beschäftigt sind, an der z.B. kein Processmessages eine Reaktion zulässt.

BUG 18. Apr 2013 14:13

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?
 
Also erstmal: Du kannst nicht herausfinden ob ein Prozess nur lange braucht oder sich aufgehangen hat.

Was du aber machen kannst, ist ein Protokoll definieren (mit Timeouts, usw.) und wenn sich der Prozess nicht entsprechend diesem Protokoll verhält, gilt er als aufgehangen. Bevor du also prüfen kannst, ob ein Prozess "gesund" ist, musst du erstmal festlegen, was ein "gesunder" Prozess ist. Das kann dir niemand wirklich abnehmen.

Zitat:

Zitat von baumina (Beitrag 1211938)
Ich befürchte das weiß oft Windows selbst nicht so recht, denn auch Programme, die im Taskmanager als "Anwendung reagiert nicht" stehen, leben oft doch noch. Das sind Anwendungen, die an einer Stelle beschäftigt sind, an der z.B. kein Processmessages eine Reaktion zulässt.

Das wäre eine Beispiel für so ein Protokoll. Der Taskmanager verwendet vermutlich MSDN-Library durchsuchenIsHungAppWindow [StackOverflow].

Je nach Anwendung könntest du z.B. auch prüfen, ob es mindestens ein sichtbares Fenster gibt.

Aphton 18. Apr 2013 14:13

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?
 
Reagiert nicht bedeutet nur, dass das GetMessage/PeekMessage nicht ordentlich aufgerufen wird - dh die Anwendung rechnet gerade intensive, weshalb es dazu nicht kommt - Windows interpretiert das so, dass die Anwendung sich aufgehangen hat.

Du kannst aber, wenn du weißt, dass nach 5 Sek. zB die Anwendung normalerweise fertig sein sollte, ein Timeout mit 10 sek setzen dann einfach terminieren.
WaitForSingleObject() mit 10*1000 MSec zB

Das mit dem Debugger - schau dir die Parameter bei CreateProcess an - "DEBUG_ONLY_THIS_PROCESS"

Anschließend, per WaitForDebugEvent() Loop die Debug-Events abholen und kucken. Da interessiert dich "EXCEPTION_DEBUG_EVENT" (wobei die erste Exception ein Sonderfall ist und einfach zu ignorieren ist)

Der schöne Günther 18. Apr 2013 14:32

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?
 
Hallo-

Vielen Dank. Das IsHungAppWindow war mir bekannt, ich hatte es nur schnell wieder wegen dem
Zitat:

[This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.]
verdrängt.

Im Endeffekt möchte ich hier auch kein professionelles System ausarbeiten - Wenn der Windows Task-Manager das (fälschlicherweise) meint, dann kann ich das dauch meinen. Das reicht mir :-)


Aber vielen Dank für die Debug-Sache, das werde ich mir bei Gelegenheit einmal genauer ansehen...


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