Seite 1 von 3

Wenn der Computer runtergefahren wird.....

Verfasst: 04.10.2009 23:03
von X360 Andy
...dann wird mein Programm ja immer direkt beendet ohne das ich noch etwas vorher bewirken kann ?

Nun würde mich aber intressieren wie die MS Office Produkte aber das Runterfahren verhindern können bzw können noch etwas ausführen.

Um es anhand meines Vorhabens zu erklären, ich habe einen Internet Chat geschrieben der sowohl im Browser als auch über eine Anwendung funktioniert.
Wenn der Chat geschlossen wird, wird eine Nachricht an den Server gesendet das der Chat Teilnehmer Offline ist.

Wenn man nun aber einfach so den Computer runterfährt wird dies nicht an den Server gesendet und man bleibt Online für die anderen User.

Nun könnte ich ein Online Script schreiben was z.b alle 5Minuten durch einen Cronjob ausgeführt wird und berechnet ob die User noch Online sind, aber ich möchte dies gerne anders lösen.
(das müsste ich zwar fast zusätzlich tun falls das Programm abstürtzt, aber dies kommt ja wesentlich weniger vor (normalerweise))

Über eine Anwort würde ich mich freuen, da man das bestimmt auch später wieder verwenden kann ( z.b für einen eigenen Editor oder änliches )

Re: Wenn der Computer runtergefahren wird.....

Verfasst: 04.10.2009 23:30
von Kaeru Gaman
wenn der Rechner runtergefahren wird und dein Programm abgeschaltet wird,
erhält es ein Event, frag mich nicht welches genau, das ihm ermöglicht darauf zu reagieren,
z.b. um noch mal zu fragen, ob gespeichert werden soll.

wenn du die Meldung "Programm reagiert nicht, sofort beenden?" siehst,
bedeutet das, dass keine Eventbearbeitung mehr vom Programm durchgeführt wird,
dass es also auf das "Hallo du wirst jetzt abgeschaltet"-Event nicht reagiert.

Re: Wenn der Computer runtergefahren wird.....

Verfasst: 05.10.2009 00:13
von AND51
Solche Aufgaben gehören in die Hände des Servers.
Einfach aus dem Grunde, dass man sich auf den Clienten allein nie verlassen sollte: Es könnte ja jemand seinen Clienten bzw. den Datenverkehr manipulieren. Oder in deinem Beispiel: Ich könnte dein Proggie auch mit dem Taskmanager gewaltsam beenden. Was machst du denn dann? Dann hilft dir deine noch-schnell-Nachricht-an-Server-verschick-Prozedur auch nichts mehr.

Deswegen lässt du den Server am besten alle 5 Sekunden eine Art Ping an jeden Clienten schicken, den dieser bestätigt. Sobald die Bestätigung "Bin noch online" nicht mehr kommt, weiß der Server, dass der Client offline ist. Trotzdem würde ich an deiner Stelle zusätzlich einbauen, dass der Client sich beim Beenden durch ein #PB_Event_CloseWindow eine ordentliche Abmeldenachricht an den Server schickt.

Re: Wenn der Computer runtergefahren wird.....

Verfasst: 05.10.2009 00:17
von Vera
Hallo X360 Andy,

habe mal gesucht und einen alten forums-thread gefunden: How intercept shutdown or logoff ?

und noch folgende Links, die Dir vielleicht weiter helfen:
- http://msdn.microsoft.com/en-us/library/aa376890(VS.85).aspx
- http://entwickler-forum.de/showthread.php?t=36348

Gruß ~ Vera

Re: Wenn der Computer runtergefahren wird.....

Verfasst: 05.10.2009 15:31
von X360 Andy
Vielen dank das was ich gerade in der schnelle gelesen habe dürfte genau dem entsprechen was ich wollte.
Muss ich heute Abend mal "testen" :cry:

@AND51
Es gibt nicht wirklich einen Server, das ganze funktioniert mit einfachen PHP Scripts die Post Request auswerten und in einer Datenbank speichert.
Der Client fordert Daten an und bekommt sie durch die Datenbank, diese werden durch den Clienten berechnet.

Eine Abfrage dauert 20-25ms (bei mir) damit würde sich auch locker eine Multiplayer Game erstellen lassen, was komplett über PHP Scripte laufen würden.

Ich mache zustätzlich noch ein Lösch Script über einen Cronjob was alle 5 Minuten errechnet (durch die letzte Anfragezeit) ob man noch Online ist, falls der Taskmanger oder änliches zum Einsatz kommt.

Re: Wenn der Computer runtergefahren wird.....

Verfasst: 05.10.2009 16:31
von Kaeru Gaman
... für ein Multiplayer Game wäre alle 5min für den Chron ein bissel wenig...

Re: Wenn der Computer runtergefahren wird.....

Verfasst: 24.10.2009 19:52
von X360 Andy
Ich habe den Code von Derlidio erfolgreich bei mir eingebaut, er fährt den Computer auch nicht runter, aber nun müsste das Herunterfahren noch abgebrochen werden, dazu muss ich ja als Antwort 1 an Windows senden. (WIN API Noob)

Was muss ich dazu alles in SendMessage stecken damit das funktioniert ?

Das Herunterfahren soll immer gestoppt werden wenn eine bedingung noch nicht erfüllt ist.
Danke schonmal

Code: Alles auswählen

Declare.l MyWindowCallback(WindowID, Message, wParam, lParam)

OpenWindow(0,0,0,320,200,#PB_Window_SystemMenu, "Test Window")

SetWindowCallback(@MyWindowCallback())

Procedure.l MyWindowCallback(WindowID, Message, wParam, lParam)

  Result = #PB_ProcessPureBasicEvents
 
  If Message = $16 ; End Session Message
      If wParam
         ; the section is ending
         If lParam
            ;user is logging off
            MessageRequester("X", "User is is logging off.")
            Else
            ;user is shutting down the system.
            MessageRequester("X", "User is shutting down the system.")
         EndIf
      EndIf
  EndIf
 
  ProcedureReturn Result
 
EndProcedure

Repeat
  If WaitWindowEvent() = #PB_Event_CloseWindow: Break: EndIf
ForEver
P.s @ KG war auch mehr ein (schlechtes) Beispiel

Re: Wenn der Computer runtergefahren wird.....

Verfasst: 24.10.2009 20:19
von ts-soft

Code: Alles auswählen

EnableExplicit

Declare MyWindowCallback(WindowID, Message, wParam, lParam)

OpenWindow(0, 0, 0, 320, 200,  "Test Window", #PB_Window_SystemMenu)

SetWindowCallback(@MyWindowCallback())

Procedure MyWindowCallback(WindowID, Message, wParam, lParam)

  Protected Result = #PB_ProcessPureBasicEvents

  If Message = #WM_QUERYENDSESSION

    If lParam = 0
      ; Neustart oder Herunterfahren
      ; mach was, aber mach es schnell
      ProcedureReturn #True
    EndIf

  EndIf

  ProcedureReturn Result

EndProcedure

Repeat
  If WaitWindowEvent() = #PB_Event_CloseWindow: Break: EndIf
ForEver
X360 Andy hat geschrieben:Das Herunterfahren soll immer gestoppt werden wenn eine bedingung noch nicht erfüllt ist.
Nein, der Userwunsch ist grundsätzlich zu akzeptieren!
Das Herunterfahren sollte niemals gestoppt werden, es sei den das Leben des PC hängt davon ab.

Gruß
Thomas

Re: Wenn der Computer runtergefahren wird.....

Verfasst: 24.10.2009 20:51
von al90
ts-soft hat geschrieben:

Code: Alles auswählen

; mach was, aber mach es schnell
Ich nehm mal an ein MessageRequester wäre da wohl fehl am platze. :lol:


Anderseits, wie wäre es denn bspw. mit sowas ?

Bild

Als frage kann man ja "Möchten Sie noch SCHNELL Speichern ?" einfügen. :lol:

:bounce:

=) :lol:

Re: Wenn der Computer runtergefahren wird.....

Verfasst: 24.10.2009 23:48
von X360 Andy
ts-soft hat geschrieben: Nein, der Userwunsch ist grundsätzlich zu akzeptieren!
Das Herunterfahren sollte niemals gestoppt werden, es sei den das Leben des PC hängt davon ab.
Danke erstmal für den Code, werde ich morgen genauer anschauen.

Das Programm ist nur für mich und meinem Schulkonto, da ich wirklich viel zu oft meinen USB Stick dort veliere / vergesse schreib ich mir nun eine hintergrund Software die per Autostart gestartet wird und überwacht falls ein USB Stick eingesteckt wird, wenn ich dann herunterfahre und der USB Stick noch drinsteckt, soll das Herunterfahren abgebrochen werden, mit einem einfachen Messegrequester der mich an das Austecken errinert.