Announcement

Collapse
No announcement yet.

application.terminate beendet nicht sofort...

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

  • application.terminate beendet nicht sofort...

    Hallo,

    hier ein Auszug aus dem Quelltext eines Projektes:

    <pre>
    var Reg : TRegistry;
    begin
    reg := TRegistry.create;
    reg.openKey(RegPfad,false);
    if Reg.ReadString('Datapath') = '' then
    begin
    Application.MessageBox('Fehler',titel, 16);
    reg.free;
    Application.terminate;
    end;
    ...
    reg.free;
    Application.Initialize;
    Application.CreateForm(Tdm, dm);
    Application.CreateForm(THauptForm, HauptForm);
    Application.Run;
    </pre>

    Ich war bisher der Annahme, dass Application.terminate die Anwendung auf der Stelle beendet. Tatsächlich wird aber dm (=Datenmodul) geladen und reagiert natürlich mit einem Fehler, da in diesem Fall der Datenpfad fehlt.

    Wie kann ich es erreichen, dass die Anwendung sofort gestoppt wird?

    Danke...

  • #2
    Hi

    procedure Halt().
    In Deinem Code gibts noch garnichts zu "terminieren" da die Application noch nicht "initialisiert" wurde und sich im .Run befindet. D.h. Terminate setzt intern ein Flag das nur in TApplication.Run ausgewertet wird.

    Gruß Hage

    Comment


    • #3
      Vielen Dank, Hagen

      Comment


      • #4
        Hallo,

        dass ist so nicht ganz richtig mit dem internen Flag Hagen (soll keine Rüge sein, sondern nur eine Verbesserung). Das Problem ist, dass App.Terminate nur PostQuitMessage(0) aufruft und somit eine Nachricht ausgesandt wird, die nicht notwendigerweise gleich verarbeitet wird. ich habe mir dadurch beholfen meine eigene prozedur zu schreiben:

        procedure Terminate();
        begin
        GlobalTerminate := true;
        Application.Terminate();
        end;

        GlobalTerminate ist global. nun könntest du alle deine aufrufe in eine if-bed. setzen und auf GlobalTerminate überprüfen. somit kannst du sichergehen, dass, obwohl terminiert wurde, keine procs von dir mehr aufgerufen werden.

        gruß,
        Marti

        Comment


        • #5
          Jain !

          Application.Terminate ruft PostQuitMessage(0) auf. Es wird also eine WM_QUIT Message "gepostet" und somit in den Messsagequeqe gelegt. Dieser wird erst mit Application.Run -> genauer Application.ProcessMessages geleert. Dabei wird auf die Message WM_QUIT geachtet, sollte diese auftreten wird das Boolean Flag Application.FTerminate auf TRUE gesetzt. Die innere Loop in Application.Run fragt nun dieses Flag mit der Zugriffsproperty Apllication.Terminated: Boolean read FTerminate; ab. Somit IST es egal ob sie gleich oder später verarbeitet wird, einzigst die Mehtode RUN entscheidet WAS passiert.

          Gruß Hage

          Comment

          Working...
          X