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/)
-   -   Was kommt zwischen QueryEndSession und EndSession? (https://www.delphipraxis.net/154422-kommt-zwischen-queryendsession-und-endsession.html)

Angel4585 10. Sep 2010 08:48

Was kommt zwischen QueryEndSession und EndSession?
 
Guten Morgen.

Ich hab ein kleines Programm, welches eine TCP-Verbindung mit nem lokalen Dienst herstellt um mit diesem Dienst zu kommunizieren.
Nun hängt sich das Programm blöderweise ständig beim herunterfahren auf, was natürllich nicht sein soll, da es dadurch den Shutdown blockiert, der automatisch nachts nach einer Sicherung stattfinden soll.

Im Programm selbst verwende ich QueryEndSession und QuerySession, da das Programm auf Befehl den Shutdown blockieren soll.
Dieser Befehl kommt momentan nie, also kann man das eigentlich ignorieren.
Allerdings habe ich festgestellt, dass QueryEndSession erfolgreich abgearbeitet, EndSession in manchen Fällen jedoch nie erreicht wird.

Stellt sich mir die Frage: Was kommt zwischen QueryEndSession und EndSession?
Wo muss ich nach dem Fehler suchen?

Ich verwende Indy TCP Komponenten, Threads, Timer.

In der QueryEndSession-Methode mache ich nichts ausser abzufragen, ob blockiert werden soll oder nicht, sollte man da auch TCP-Verbindungen etc beenden?
Hab das bisher immer im finalization Abschnitt gemacht.

Angel4585 14. Sep 2010 09:32

AW: Was kommt zwischen QueryEndSession und EndSession?
 
Oha, keiner eine Idee? :(

Blup 24. Sep 2010 08:49

AW: Was kommt zwischen QueryEndSession und EndSession?
 
QueryEndSession ist ja nur die Frage an die Anwendung, ob Einspruch gegen das Beenden erhoben wird.
Die Frage muss einfach beantwortet werden. Ob wirklich die Session beendet wird, hängt ja auch von den anderen Anwendungen ab. Deshalb sollte das Programm als Reaktion auf diese Nachricht keine weiteren Aktionen unternehmen.
Bei Endsession kann eigentlich das Beenden nicht mehr wirklich verhindert werden. Hier kann die Anwendung einfach nicht gespeicherte Daten bzw. den aktuellen Status z.B. in einer speziellen Sicherungsdatei speichern, so dass beim nächsten Programmstart die Arbeit an dieser Stelle fortgesetzt wird. Den Benutzer noch zu Fragen, ob er die Änderungen wirklich speichern will, ist eher ungünstig.

hboy 24. Sep 2010 10:08

AW: Was kommt zwischen QueryEndSession und EndSession?
 
Zwischen QueryEndSession und EndSession vergehen ein paar Sekunden Bedenkzeit, bei dem auf die Rückgabewerte der QueryEndSession messages gewartet wird. Wie man das Herunterfahren abbricht, ist hier zu sehen (das sollte die Schwierigkeit nicht gewesen sein)
http://www.delphipraxis.net/972598-post8.html
vom feeling her würde ich einen Dialog mit countdown ala "Herunterfahren abbrechen (3..2..1..)" anzeigen lassen, falls noch wichtige Vorgänge laufen und ein user davorsitzt. Wenn die Zeit verstrichen ist, keine Interaktion erfolgt ist und noch etwas wichtiges am Laufen war, kann man einen Protokolleintrag erzeugen, unter welchen Umständen das Herunterfahren ausgeführt wurde.

Luckie 24. Sep 2010 11:10

AW: Was kommt zwischen QueryEndSession und EndSession?
 
Ab Vista ist es allerdings so, dass das Betriebssystem keine Rücksicht mehr nimmt auf den Rückgabewert von QueryEndSession. Das Betriebssystem fährt auch runter, wenn man sagt, es soll nicht runterfahren. Die Entwickler haben sich gesagt, "der Benutzer will das System runterfahren, also fahren wir es auch runter".

hboy 24. Sep 2010 13:02

AW: Was kommt zwischen QueryEndSession und EndSession?
 
Danke für den Hinweis, das ist natürlich unschön. Kann man wenigstens mit "shutdown -a" noch etwas reißen oder sind die Shellbefehle ab QueryEndSession auch nicht mehr verfügbar?

Luckie 24. Sep 2010 13:40

AW: Was kommt zwischen QueryEndSession und EndSession?
 
Ich finde es nicht unschön. Ich fand es immer nervig, wenn ein Programm das Runterfahren abgebrochen hat, obwohl ich den Rechner runterfahren wollte.

Mit shutdown -a kann man das sicherlich abbrechen, allerdings sind zum Ausführen Administratorrechte erforderlich und die sollten eigentlich bei einem gewöhnlichem Nutzer nicht vorhanden sein.

himitsu 24. Sep 2010 14:33

AW: Was kommt zwischen QueryEndSession und EndSession?
 
Und was ist, wenn ein Programm noch ein bissl braucht, um alles zu speichern und zu beenden?

Aber ich weiß was du meinst ... z.B. der blöde DExplorer (Delphis neue OH) beendet sich nicht richtig und verhindert dann das Runterfahren. (warum auch immer man da sowas drin verbaut hat)

Namenloser 24. Sep 2010 14:51

AW: Was kommt zwischen QueryEndSession und EndSession?
 
Zitat:

Zitat von Luckie (Beitrag 1051709)
Ich finde es nicht unschön. Ich fand es immer nervig, wenn ein Programm das Runterfahren abgebrochen hat, obwohl ich den Rechner runterfahren wollte.

Achja, das war bei Windows 98 immer ganz toll... jeden zweiten Tag hat sich irgendein Programm aufgehängt und den Shutdown verhindert, ohne dass es eine Möglichkeit gegeben hätte, das zu umgehen (gut, gab es sicher, aber kannte ich damals nicht).

Luckie 24. Sep 2010 15:22

AW: Was kommt zwischen QueryEndSession und EndSession?
 
@himitsu: Man kann das Runterfahren nur verzögern, wenn man QueryEndSession negativ beantwortet. Zeit zum Speichern bleibt also noch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 Uhr.

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