Announcement

Collapse
No announcement yet.

Sofortiges Programmende?

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

  • Sofortiges Programmende?

    Hallo<br>

    ich habe ein Problem, das mich doch etwas verblüfft.<br>

    procedure THauptF.newPaint;<br>
    var k,l: integer;<br>
    begin<P>
    for l:=1 to 8 do begin<P>
    for k:=1 to 1000000 do application.processmessages;<p>
    end;<P>
    end;<br>

    Wenn ich nun während er schön zählt mein Programm per Schließen-Button beenden will,<br>
    macht er die Schleife erst mal zuende.<br>
    Eigentlich dachte ich, dass er da "automatisch" sofort alles abbricht.<br>
    Jedenfalls soll er das.<br>
    Geht das zu machen?<br>

    Gruß<br>
    Matthias

  • #2
    frage mit Application.Terminated ab ob die Anwendung gerade terminiert. Fall Application.Terminated TRUE liefert springste per Exit aus deiner Loop raus. Du solltest diese Abfrage nach dem Application.ProcessMessages machen.<br>
    Das Verhalten ansich ist aber absolut korrekt, frage dich mal was passieren würde falls Application sich nicht so verhalten würde ?!<br>

    Gruß Hage

    Comment


    • #3
      Hallo Hagen,<br>

      das war ein Denkfehler von mir. Ich dachte tatsächlich, er arbeitet bei einem<br>
      application.procesmmessages ALLE Botschaften ab, die er bisher bekommen und noch<br>
      nicht behandelt hat. Wobei das WM_Quit eine Art "oberste Prorität" hat.<br>
      Aber das darf er natürlich gar nicht. Es gibt eine Reihe von Schleifen und anderes,<br>
      das man garantiert nicht unterbrechen darf.<br>
      Mit Application.Terminated ist es genau richtig.

      Danke!
      Matthia

      Comment


      • #4
        Application.ProcessMessages arbeitet tatsächlich alle Botschaften ab, auch wm_Quit. Nur in diesem Moment wird intern Application.Terminated auf TRUE gesetzt. Da aber nur die MAIN-Loop in Application.Run auf Terminated reagiert, sprich beendet und somit die Anwednung terminiert, können untergeordnete Schleifen wie Deine garnicht das Program beenden. Das liegt daran das erst das Auslesen und Dispatchen der Messages in Application.Run dazu führte das Deine Loop überhaupt gestartet werden konnte. Deine Loop steht in einem Codeteil das indirekt per Message aus Application.Run aufgerufen wurde, wie alle Event übrigens. D.h. wird Deine Loop beendet kehrt das Event zum Aufrufer zurück und der alleroberste Aufrufer ist die Loop in Application.Run. Sollange nicht diese Loop beendet wurde lauft die Anwednung weiter.

        Gruß Hagen

        PS: ich hoffe meine Ausschweifungen sind nicht zu verworren :

        Comment

        Working...
        X