AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Anwendung sauber beenden bei Shutdown
Thema durchsuchen
Ansicht
Themen-Optionen

Anwendung sauber beenden bei Shutdown

Ein Thema von TUX_der_Pinguin · begonnen am 6. Dez 2010 · letzter Beitrag vom 7. Dez 2010
Antwort Antwort
dfried

Registriert seit: 16. Aug 2005
486 Beiträge
 
#1

AW: Anwendung sauber beenden bei Shutdown

  Alt 6. Dez 2010, 15:13
ich glaube WM_ENDSESSION ist Dein Freund....
Fast, es ist WM_QUERYENDSESSION
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#2

AW: Anwendung sauber beenden bei Shutdown

  Alt 6. Dez 2010, 15:21
Laß' die Schleife in WMEndSession weg.

Grund.

Application.ProcessMessages; verarbeitet die Nachrichten behandlung.
Dabei wartet die Abarbeitung in Routine natürlich auf das Ende von ProcessMessages.
Nun wird in ProcessMessages die das WMEndSession abgearbeitet.
In WMEndSession gibt es nun eine weitere Schleifen, welche neue Nachrichten behandelt, wärend auf das Ende der von Routine geawartet wird.
Routine wird aber nie fertig, da es ja auf das Ende von WMEndSession wartet.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Anwendung sauber beenden bei Shutdown

  Alt 6. Dez 2010, 15:24
Fast, es ist WM_QUERYENDSESSION
Ich glaube, das bräuchte man nicht zu reimplementieren. Das Löst OnCloseQuery aus. Aber dort wird nicht unterschieden, ob es vom Anwender kommt (X oder Alt+F4) oder ob es ein Shutdown ist. Außerdem sollte man in diesem Ereignis nicht all zu lange rum machen, nur quasi schnell antworten ob ein Schliessen möglich ist oder nicht.

WM_ENDSESSION wird hingegen unter anderen Bedingungen ausgelößt und man erkennt wie gesagt an dem WPARAM der Message woher der Aufruf kommt.

Laß' die Schleife in WMEndSession weg.
Dem kann ich mich nur anschliessen. Ich würde in WM_ENDSESSION nur dafür sorgen, dass die Methode abgebrochen wird.

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Anwendung sauber beenden bei Shutdown

  Alt 7. Dez 2010, 11:32
Guten Morgen,

nach reichlicher Überlegung und stundenlangem Probieren bin ich zu einer Lösung gekommen. Das Problem
war das das Warten auf Beendigung der Prozedur den Ablauf der Prozedur blockiert hat. Daher habe ich
die Routine in einen Thread verlagert. So ist es nun möglich diesen Thread vorzeitig zubeenden und auf
dessen Beendigung zu warten.

Delphi-Quellcode:
procedure TfrmMain.btnStartClick(Sender: TObject);
begin
  if not bThreadRunning then begin
    //Flag setzen, Thread wird erzeugt und gestartet
    bThreadRunning := True;

    //Buttons
    btnStart.Enabled := False;
    btnCancel.Enabled := True;

    //Thread Erzeugen
    UpdateThread := TUpdate.Create(True);
    UpdateThread.FreeOnTerminate := True;
    UpdateThread.Priority := tpNormal;
    UpdateThread.OnTerminate := UpdateThreadTerminate;
    UpdateThread.Resume;
  end;{if}

end;

//Merkwürdigerweise wird das Ereignis OnCloseQuery beim Shutdown nicht mehr ausgeführt, obwohl in
//der Richtigen Anwendung das der Fall war. Aber es ist ja ganz einfach möglich die Sicherheitsabfrage
//beim Shutdown zu überspringen
procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  //Anwender fragen ob Anwendung wirklich beendet werden soll
  if (Application.MessageBox('Soll das Programm beendet werden?', 'Frage', 36) = ID_YES) then begin

    //Falls Routine noch läuft wird diese beendet
    if bThreadRunning then begin
      //Thread beenden
      UpdateThread.Terminate;

      //Kurz warten bis der Thread sich beendet hat
      while bThreadRunning do begin
        Application.ProcessMessages;
      end;{while}
    end;{if}

    //Anwendung kann geschlossen werden
    CanClose := True;
  end
  else
    CanClose := False;

end;

//Dieses Ereignis wird sowohl beim Beenden durch den Anwender als auch beim Shutdown durchgeführt
//Das ist es was ich die ganze Zeit wollte, explizit die Routine beenden und entsprechen "aufräumen"
procedure TfrmMain.UpdateThreadTerminate(Sender: TObject);
begin
  //Routine wurde beendet
  bThreadRunning := False;
  Edit1.Text := 'Fertig';

  //Buttons
  btnStart.Enabled := True;
  btnCancel.Enabled := False;

  //deinitialisieren
  UpdateThread := nil;

  //Nur zu Testzwecken das man sehen kann das die Routine bis hierher "durchgelaufen" ist
  pDelay(1000);
end;

procedure TfrmMain.WMEndSession(var Msg: TMessage);
begin
  //Kurz warten bis der Thread sich beendet hat
  while bThreadRunning do begin
    Application.ProcessMessages;
  end;{while}

  //Bestätigung das der Computer herruntergefahren wird
  Msg.Result := 1;
end;

procedure TfrmMain.WMQueryEndSession(var Msg: TMessage);
begin
  //Falls Routine läuft muss diese abgebrochen werden
  if bThreadRunning then UpdateThread.Terminate;

  //Bestätigung das Windows herruntergefahren werden darf
  Msg.Result := 1;
end;
Die eigentliche Routine die die Arbeit erledigt steht im Thread und sieht wie folgt aus.
Delphi-Quellcode:
procedure TUpdate.Execute;
begin
  while (Counter < 500000) and not Terminated do begin
    Synchronize(Show);
    Inc(Counter);
  end;{while}
end;
Anbei noch mal das gesamte Test-Projekt.

Vielen dank für die Tipps und Anregungen.

MFG

TUX
Angehängte Dateien
Dateityp: zip Shutdown-Test.zip (263,8 KB, 23x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz