Announcement

Collapse
No announcement yet.

Anwendung reagiert nicht mehr

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Anwendung reagiert nicht mehr

    Hallo,<br>ich weiß, das Windows eine Botschaft an alle Anwendung versendet, um festzustellen, ob die Anwendung noch reagiert. Weiß jemand wie diese Botschaft heißt und mit welcher Botschaft die Anwendnung antwortet (wenn sie antwortet)?<br>Jens Schumann

  • #2
    sorry jens leider nicht, aber interessieren würde es mich auch
    Herzliche Grüße

    Markus Lemcke
    barrierefreies Webdesign

    Comment


    • #3
      WM_NULL, und die Anwendung tut garnichts daraufhin, ausser diese Message vom Messagequeue zu entfernen. Das reicht dem System aber schon aus, weil eine hängende Anwendung eben meistens ihren Queue nicht mehr ausliest. Sollte ein Anwendung hängen und trotzdem noch den Queue auslesen kann auch das System nicht erkennen das die Anwendung hängt. Diesen Fall erkennt man daran das z.B. der task-manager glaubt die Anwendung läuft noch korrekt.

      Gruß Hage

      Comment


      • #4
        Hallo Hagen,<br>vielen Dank. Ich möchte mit einer kleinen Anwendung (Watchdog) erkennen, ob die Hauptanwendung noch reagiert. Z.Z. habe ich das mit SendMessageTimeOut gelöst. In bestimmten Zeitabständen sendet der Watchdog über SendMessageTimeOut eine Botschaft an die Hauptanwendung. Wenn diese innerhalb der festgelegten Zeitspanne nicht mit einer Botschaft antwortet, geht der Watchdog davon aus, dass die Hauptanwendung abgeschmiert ist. Wenn das der Fall ist, beendet der Watchdog mit TerminateProcess die Hauptanwendung. Ich weiß nicht, ob TerminateProcess sonderlich geschickt ist. Anschließend startet der Watchdog die Hauptanwendung wieder.<br>Ich weiß auch nicht, ob das Verfahren besonders geschickt ist. Ich denke, das senden von WM_NULL ist besser. Jetzt stellt sich mir aber die Frage: Wie erkennt der Watchdog, dass die Hauptanwendung nicht mehr die MessageQueue abfragt.<br>Jens Schuman

        Comment


        • #5
          Na daran das SendMessageTimeout einen Timeout liefert.<br>
          WM_NULL ist nur eine Message die von jedem Programm verarbeitet wird, aber nichts bewirkt. Verarbeitet das Programm die Message dann lebt sie noch und SendMessageTimeout meldet eine erfolgereiche Ablieferung.<br>
          TerminateProcess ist in Ordnung. Das Programm reagiert ja nicht mehr auf Messages und muss totgeschossen werden. Achte aber darauf das das betreffende Programm nicht laengere Berechnungen ohne Bedienung der Messages macht, sonst schiesst Du es tot obwohl es ihm gutgeht

          Comment


          • #6
            Hallo Robert,<br>vielen Dank.<br>Jens Schuman

            Comment


            • #7
              Hallo Leute,

              nette Geschichte mit dem WM_NULL !
              Aber das kann ich ja nur an ein Fenster Handle schicken.
              Gibt es sowas auch für die direkte Processüberwachung ?
              Es sollte in folgenden Code passen:

              <PRE>
              var
              PH : THandle;
              PIDList : array[0..1000] of Integer;

              begin
              {in einer Schleife}
              PH := OpenProcess(PROCESS_TERMINATE or PROCESS_VM_READ OR
              PROCESS_QUERY_INFORMATION OR SYNCHRONIZE,
              False, PIDList[i]);
              // Jetzt die gesuchte Funtion
              // als Beispiel sowas
              if SendProcMessageTimeout(PH, WM_NULL, nTimeout) <> 0 then
              Memo1.Lines.Add('Process läuft')
              else
              Memo1.Lines.Add('Process reagiert nicht');
              CloseHandle(PH);
              end;
              </PRE>

              Geht sowas ?
              Wenn ja wie ?

              Gruß
              M.Buc

              Comment


              • #8
                Prozesse ohne Fenster 'reagieren' so oder so nicht.<br>
                Es kann normal sein, daß alle Threads im angehaltenen Zustand sind, oder eben nicht...

                - nic

                Comment

                Working...
                X