Sofort beenden bei Shutdown umgehen?
Sofort beenden bei Shutdown umgehen?
Liebe Community,
habe öfters das Problem, das meine Programme beim herunterfahren des Rechers zu lange brauchen zum "herunterfahren" und einfach Fenster erscheint bei dem ich "Sofort schließen" klicken kann oder eben die paar Sekunden warten kann.
Kann ich irgendwie in meinem Programm abfangen, wenn Windows es versucht zu schließen und somit mein Programm normal versuchen zu schließen?
MFG,
Tombi
habe öfters das Problem, das meine Programme beim herunterfahren des Rechers zu lange brauchen zum "herunterfahren" und einfach Fenster erscheint bei dem ich "Sofort schließen" klicken kann oder eben die paar Sekunden warten kann.
Kann ich irgendwie in meinem Programm abfangen, wenn Windows es versucht zu schließen und somit mein Programm normal versuchen zu schließen?
MFG,
Tombi



Intel Pentium 4 630 (3 GHZ)
Re: Sofort beenden bei Shutdown umgehen?
in einer normalen Eventschleife (WaitWindowEvent()) bekommst DuTombi hat geschrieben:Kann ich irgendwie in meinem Programm abfangen, wenn Windows es versucht zu schließen und somit mein Programm normal versuchen zu schließen?
nicht mit, wenn Windows die Rundmail "Ich fahre jetzt runter"
(#WM_QUERYENDSESSION) versendet. Dazu musst Du mittels
SetWindowCallback() einen erweiterten EventHandler einrichten.
Beispiel aus der PB-Hilfe leicht angepasst:
Code: Alles auswählen
Procedure WinCallback(hWnd, uMsg, wParam, lParam)
If uMsg = #WM_QUERYENDSESSION
; hier dein Programm adäquat beenden
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
If OpenWindow(0, 0, 0, 200, 100, "Messages", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget)
SetWindowCallback(@WinCallback()) ; activate the callback
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
EndIf
a²+b²=mc²
Re: Sofort beenden bei Shutdown umgehen?
Cool, werde ich gleich mal ausprobieren.
Wird schon schief gehen
Gibt es den noch andere Dinge die ich beachten sollte?
MFG,
Tombi
Edit:
Sollte funktionieren?
Edit2: Oder sollte ich anstelle "Quit = 1" lieber gleich mit "End" beenden?
Wird schon schief gehen

Gibt es den noch andere Dinge die ich beachten sollte?
MFG,
Tombi
Edit:
Sollte funktionieren?
Code: Alles auswählen
Global Quit = 0
Procedure WinCallback(hWnd, uMsg, wParam, lParam)
If uMsg = #WM_QUERYENDSESSION
Quit = 1
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
If OpenWindow(0, 0, 0, 200, 100, "Test", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget)
SetWindowCallback(@WinCallback()) ; activate the callback
Repeat
Debug "Anwendung läuft noch..."
Delay(10000)
Until Quit = 1
EndIf



Intel Pentium 4 630 (3 GHZ)
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Sofort beenden bei Shutdown umgehen?
Dann solltest Du mal für eine vernünftige Eventloop-Schleife sorgen!Tombi hat geschrieben:Liebe Community,
habe öfters das Problem, das meine Programme beim herunterfahren des Rechers zu lange brauchen zum "herunterfahren" und einfach Fenster erscheint bei dem ich "Sofort schließen" klicken kann oder eben die paar Sekunden warten kann.
#WM_QUERYENDSESSION brauchste hierfür in keinem Fall (eher das gegenteil

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Sofort beenden bei Shutdown umgehen?
In einer Eventschleife (so vernünftig sie auch programmiert sein möge) bekommst
Du IMO nicht mit, dass Dein Programm beendet wird, weil der Rechner herunterfährt.
Grüße ... Kiffi
Du IMO nicht mit, dass Dein Programm beendet wird, weil der Rechner herunterfährt.
was wäre das Gegenteil zu #WM_QUERYENDSESSION?ts-soft hat geschrieben:#WM_QUERYENDSESSION brauchste hierfür in keinem Fall (eher das gegenteil)
Grüße ... Kiffi
a²+b²=mc²
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Sofort beenden bei Shutdown umgehen?
#WM_QUERYENDSESSION dient dazu, noch etwas zu speichern oder den runterfahren Prozeß zu verzögern.
Er möchte ja das Gegenteil, Windows fährt nicht sofort herunter, weil sein Programm nicht richtig beendet.
Hierfür hat er nicht auf diese Message zu reagieren, sondern sollte allgemein dafür sorgen das die
Messages im Pool nicht überlaufen (er den EventLoop nicht zu lange verläßt). Bei vernünftigem EventLoop
gäbe es das Problem nicht, das Windows meckert, es könne sein Programm nicht schnell genug beenden.
Gruß
Thomas
Er möchte ja das Gegenteil, Windows fährt nicht sofort herunter, weil sein Programm nicht richtig beendet.
Hierfür hat er nicht auf diese Message zu reagieren, sondern sollte allgemein dafür sorgen das die
Messages im Pool nicht überlaufen (er den EventLoop nicht zu lange verläßt). Bei vernünftigem EventLoop
gäbe es das Problem nicht, das Windows meckert, es könne sein Programm nicht schnell genug beenden.
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Sofort beenden bei Shutdown umgehen?
#WM_QUERYENDSESSION ist in allererster Hinsicht eine Nachricht.ts-soft hat geschrieben:#WM_QUERYENDSESSION dient dazu, noch etwas zu speichern oder den runterfahren Prozeß zu verzögern.
Wie man auf diese Nachricht reagiert, ist dem Programmierer
überlassen.
#WM_QUERYENDSESSION impliziert nicht zwingend ein
verzögertes Programmende.
Ich verstehe deshalb nicht, warum Deiner Meinung nach
#WM_QUERYENDSESSION so gänzlich ungeeignet sein soll.
Grüße ... Kiffi
a²+b²=mc²
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Sofort beenden bei Shutdown umgehen?
Weil #WM_QUERYENDSESSION mit seinem Problem nichts zu tun hat.
Sein Eventloop wird zu lange verlassen, so das das Programm auf #WM_CLOSE nicht schnell
genug reagiert. Wenn er zusätzlich bei dieser Message, die ja auch nicht schnell genug
bearbeitet wird, noch ein #WM_CLOSE (end) einfügt hat er rein garnichts erreicht, weil auch diese
Message einen besseren Eventloop benötigt!
Wenn der Wassereimer überläuft fülle ich doch nicht noch mehr Wasser ein
Sein Eventloop wird zu lange verlassen, so das das Programm auf #WM_CLOSE nicht schnell
genug reagiert. Wenn er zusätzlich bei dieser Message, die ja auch nicht schnell genug
bearbeitet wird, noch ein #WM_CLOSE (end) einfügt hat er rein garnichts erreicht, weil auch diese
Message einen besseren Eventloop benötigt!
Wenn der Wassereimer überläuft fülle ich doch nicht noch mehr Wasser ein

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Sofort beenden bei Shutdown umgehen?
Habe es mal mit PB4.51 unter Windows 7 getestet.
Purebasic beendet mit saubere EventLoop immer das Programm. Das Event #PB_Event_CloseWindow (WM_CLOSE) kommt nicht mehr an. Also selber über Callback darauf reagieren, wenn noch etwas erledigt werden muss.
FF 
Purebasic beendet mit saubere EventLoop immer das Programm. Das Event #PB_Event_CloseWindow (WM_CLOSE) kommt nicht mehr an. Also selber über Callback darauf reagieren, wenn noch etwas erledigt werden muss.
Code: Alles auswählen
#ENDSESSION_LOGOFF = $80000000
Procedure WinCallback(hWnd, uMsg, wParam, lParam)
If uMsg = #WM_QUERYENDSESSION
If lParam & #ENDSESSION_LOGOFF
MessageRequester("Query end session", "Benutzerabmeldung...")
Else
MessageRequester("Query end session", "Herunterfahren...")
EndIf
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Sofort beenden bei Shutdown umgehen?
Wenn sein Programm zu selten das WaitWindowEvent erreicht nützt auch das Callback nicht viel.
Er sollte lieber ein vernünftiges EventLoop integrieren, so das im allg. die Events besser
verarbeitet werden, als sich darauf verlassen das es im callback besser funktionieren könnte, aber
der rest des programms trotzdem tod bleibt
Wahrscheinlich geht ihr alle zu sehr auf seinem Titel ein, der eigentlich das Gegenteil seiner Frage ist.
Er braucht nicht dazu tun, das sein Programm bei #WM_QUERYENDSESSION schließt, lediglich sein
Programm sollte öfter mal bei WaitWindowEvent ankommen, weil Windows ja nicht ewig warten kann,
bevor es den Rechner runterfährt.
Das bearbeiten der Message ist nicht die Frage, lediglich ankommen muß sie (WaitWindowEvent(), die wird dann autom.
durchgereicht, bis sie wieder bei Windows ankommt und Windwos weiß, man hat Kenntnis davon und z.B. shutdown kann durchgeführt werden.
Versteht wahrscheinlich immer noch keiner, besser ausdrücken kann ich es aber nicht
Gruß
Thomas
Er sollte lieber ein vernünftiges EventLoop integrieren, so das im allg. die Events besser
verarbeitet werden, als sich darauf verlassen das es im callback besser funktionieren könnte, aber
der rest des programms trotzdem tod bleibt

Wahrscheinlich geht ihr alle zu sehr auf seinem Titel ein, der eigentlich das Gegenteil seiner Frage ist.
Er braucht nicht dazu tun, das sein Programm bei #WM_QUERYENDSESSION schließt, lediglich sein
Programm sollte öfter mal bei WaitWindowEvent ankommen, weil Windows ja nicht ewig warten kann,
bevor es den Rechner runterfährt.
Das bearbeiten der Message ist nicht die Frage, lediglich ankommen muß sie (WaitWindowEvent(), die wird dann autom.
durchgereicht, bis sie wieder bei Windows ankommt und Windwos weiß, man hat Kenntnis davon und z.B. shutdown kann durchgeführt werden.
Versteht wahrscheinlich immer noch keiner, besser ausdrücken kann ich es aber nicht
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
