Seite 1 von 1

Shutdown

Verfasst: 17.08.2012 07:09
von 7x7
Weiss jemand, wie ich innerhalb meines Programms abfragen kann, ob der Rechner gerade heruntergefahren wird?

Re: Shutdown

Verfasst: 17.08.2012 07:28
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.

Re: Shutdown

Verfasst: 17.08.2012 07:35
von 7x7
Danke dige! Habe aber mit Callbacks noch nie was gemacht. Kannst du mir mal ein Codebeispiel geben?

Re: Shutdown

Verfasst: 17.08.2012 08:05
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 ;)

Re: Shutdown

Verfasst: 17.08.2012 12:02
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:

Re: Shutdown

Verfasst: 18.08.2012 07:23
von 7x7
Danke euch allen für Code und Tipps! Die Lösung dieses Problems war mir sehr wichtig. :allright:

Re: Shutdown

Verfasst: 20.08.2012 07:56
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?

Re: Shutdown

Verfasst: 20.08.2012 10:50
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