Shutdown

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Shutdown

Beitrag von 7x7 »

Weiss jemand, wie ich innerhalb meines Programms abfragen kann, ob der Rechner gerade heruntergefahren wird?
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
dige
Beiträge: 1235
Registriert: 08.09.2004 08:53

Re: Shutdown

Beitrag von dige »

In deinem Programm einen Callback einrichten und die Messages
auf #WM_QUERYENDSESSION überprüfen. Diese Message wird
von Windows an alle Programme gesendet, bevor der Rechner
runter gefahren wird.

Wenn Du mit Return = #NULL reagierst (statt #PB_ProcessPureBasicEvents)
wartet Windows, bis Dein Programm beendet ist.
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Shutdown

Beitrag von 7x7 »

Danke dige! Habe aber mit Callbacks noch nie was gemacht. Kannst du mir mal ein Codebeispiel geben?
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Shutdown

Beitrag von Bisonte »

Ich heiße zwar nicht dige, aber

Code: Alles auswählen

Procedure WindowCallback(hWnd, uMsg, wParam, lParam)
  
  Protected Result = #PB_ProcessPureBasicEvents
  
  If uMsg = #WM_QUERYENDSESSION
    
    ; Hier der Programmcode der ausgeführt werden soll
    Debug "Windows wird heruntergefahren !"
    
  EndIf
  
  ProcedureReturn Result
  
EndProcedure

OpenWindow(0,200,300,800,600,"TestWindow")

SetWindowCallback(@WindowCallback())

Repeat

Until WaitWindowEvent() = #PB_Event_CloseWindow
bitteschön ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
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: Shutdown

Beitrag von ts-soft »

So wie Bisonte es macht und möglichst nicht mit ProcedureReturn 0 arbeiten, sondern den Code so minimieren das
er es schafft alles zu erledigen.
Das aufhalten von Windows ist nicht so einfach und mit ProcedureReturn 0 wird es mit Vista/7 usw. eher nicht klappen.
Da sind dann noch ein paar weitere API Aufrufe fällig. genauso wie auf Server-Systemen, aber die werden ja nur selten
heruntergefahren :mrgreen:
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.
Bild
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Shutdown

Beitrag von 7x7 »

Danke euch allen für Code und Tipps! Die Lösung dieses Problems war mir sehr wichtig. :allright:
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
dige
Beiträge: 1235
Registriert: 08.09.2004 08:53

Re: Shutdown

Beitrag von dige »

ts-soft hat geschrieben:So wie Bisonte es macht und möglichst nicht mit ProcedureReturn 0 arbeiten, sondern den Code so minimieren das
er es schafft alles zu erledigen.
Das aufhalten von Windows ist nicht so einfach und mit ProcedureReturn 0 wird es mit Vista/7 usw. eher nicht klappen.
Da sind dann noch ein paar weitere API Aufrufe fällig. genauso wie auf Server-Systemen, aber die werden ja nur selten
heruntergefahren :mrgreen:
Was denn? Wenn ich das Programm zum Shutdown Zeitpunkt nicht gleich beenden kann, weil noch
Threads laufen etc., werfe ich immer #Null zurück und lande damit in der Liste der Programme, auf die
Win7 noch warten muss...
Ist das Programm dann fertig und beendet, geht der ShutDown weiter...

Also was muss denn da noch an API Calls rein?
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
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: Shutdown

Beitrag von ts-soft »

Man kann sich nicht drauf verlassen, das der Shutdown wartet. Da gibt es div. Einstellungen, wie "schnelles Herunterfahren" unter XP usw.

Thread müssen ja auch nicht sauber beendet werden, Speicherlecks sind doch unwichtig, wenn Windows beendet :mrgreen:
Nur das notwendigste sichern ist die Divise. Wenn dafür die Zeit nicht reicht, wäre zwischendurch sichern angesagt.

Seit Vista gibt es dann noch eine weitere API, die man in solchen Fällen nutzen kann:
ShutdownBlockReasonCreate
ShutdownBlockReasonDestroy

Mit 0 zurückgeben, riskiert man, Windows gar nicht mehr beenden zu können, außer über Netzschalter.

Also, wenn es vermeidbar ist, einfach nur eine kurze Speichern-Routine nach der Message ausführen und nichts weiter.
Das klappt nach meinen Erfahrungen bisher immer gut.

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.
Bild
Antworten