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 Feststellen, ob ein Programm eingefrohren ist. (https://www.delphipraxis.net/66018-feststellen-ob-ein-programm-eingefrohren-ist.html)

Stony2k 23. Mär 2006 14:57


Feststellen, ob ein Programm eingefrohren ist.
 
Es kann ja gut sein, dass eine Anwendung noch aktiv ist, diese aber nicht mehr reagiert, also eingefrohren ist.

Wie kann ich dies feststellen?

Luckie 23. Mär 2006 15:05

Re: Feststellen, ob ein Programm eingefrohren ist.
 
Schicke mit MSDN-Library durchsuchenSendMessageTimeOut MSDN-Library durchsuchenWM_NULL ab das Fenster. Und wenn die Funktion mit dem Wert 0 zurückkehrt ist sie entweder fehlgeschlagen oder der TimeOut wurde überschritten. Jetzt musst du dir nur noch überlegen, ab wie viel Millisekunden du das Programm für abgestürzt erklärst. Windows verfährt übrigens ähnlich, wenn es im Taskmanager anzeigt: "Reagiert nicht mehr". Das heißt, dieser Zustand kann auch eintreten, wenn das Programm in einer längeren Schleife steckt und deshalb keine Nachrichten aus der Nachrichtenschlange abholen kann.

Christian Seehase 24. Mär 2006 18:15

Re: Feststellen, ob ein Programm eingefrohren ist.
 
Moin Stony,

oder schau Dir mal die API-Funktion MSDN-Library durchsuchenIsHungAppWindow an.

Luckie 24. Mär 2006 21:09

Re: Feststellen, ob ein Programm eingefrohren ist.
 
Klingt nett, ich würde aber meine Finger davon lassen:
Zitat:

However, this function is not intended for general use. It is recommended that you do not use it in new programs because it might be altered or unavailable in subsequent versions of Windows.
Und im Endeffekt macht es ja nichts anderes, als was ich vorgeschlagen habe. ;)

Stony2k 25. Mär 2006 07:51

Re: Feststellen, ob ein Programm eingefrohren ist.
 
Ich habe nun folgendes gemacht:
Delphi-Quellcode:
procedure Tfrm_main.StartButtonClick(Sender: TObject);
Var
  DWResult: DWORD;
  hWindowHandle: HWND;
  Result: integer;
begin
  hWindowHandle := FindWindow('SphereSvr', 'SphereServer V0.56b-Nightly - MyShard (Running) ');
  Result := SendMessageTimeout(hWindowHandle, WM_NULL, 0, 0,SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);
end;
Die 5000 müssten ja 5 Milisekunden sein.. und Result lieft als Rückgabewert dann 0, sobald das Fenster nicht geöffnet ist, oder das Programm nicht reagier, richtig?
Und wie kille ich dann den Prozess?

//Edit: Die Funktion KillProzess funzt einwandrei: http://www.delphipraxis.net/internal...messagetimeout

Luckie 25. Mär 2006 09:41

Re: Feststellen, ob ein Programm eingefrohren ist.
 
5000 sind 5 Sekunden. ;)

himitsu 25. Mär 2006 09:54

Re: Feststellen, ob ein Programm eingefrohren ist.
 
Zitat:

Zitat von Luckie
5000 sind 5 Sekunden. ;)

Jupp ... Wert wird in Millisekunden angegeben,

also Milli = Tausenstel

5000 = 5 * 1000
x Milli = x / 1000

demnach 5 * 1000 / 1000 = 5 in der Standardeinheit, was hier Sekunden sein sollten :stupid:

Luckie 25. Mär 2006 09:58

Re: Feststellen, ob ein Programm eingefrohren ist.
 
Ich habe gerade was gesehen: MSDN-Library durchsuchenWM_NULL
Zitat:

As another example, an application can check if a window is responding to messages by sending the WM_NULL message with the SendMessageTimeout function.
Hehe, habe ich doch intuitiv die richtige Lösung gepostet. :mrgreen:

Stony2k 25. Mär 2006 10:38

Re: Feststellen, ob ein Programm eingefrohren ist.
 
Habe auch Sekunden gemein, habe mich da nur verschrieben gehabt ;)

Gut, soweit funktioniert alles und wenn ich noch Hilfe brauche, melde ich mich.

Danke :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf