Beenden einer Anwendung durch Windows-Shutdown, abschließendes Schreiben von Daten (Uhrzeit)

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Dideldum.

    Beenden einer Anwendung durch Windows-Shutdown, abschließendes Schreiben von Daten (Uhrzeit)

    Hallo,
    ich habe mir ein kleines Programm geschrieben, das bei Beenden die Uhrzeit in eine Datei wegschreibt. Klappt wunderbar.
    Nun möchte ich, daß das auch gemacht wird, wenn ich den Rechner herunterfahre und ich das Programm nicht selber beendet habe. Das ist ja kein normaler Vorgang zum Beenden eines Programmes, sondern vermutlich schießt Windows den Prozeß einfach ab.
    Wie bekommt man das hin ?
    Bei einer WinForms-App gibt es auch bei einem »Abschuss« das FormClosing-Event. Darin enthalten ist der Parameter e, der angibt, warum die App geschlossen wird. Aber wie auch immer: Abgefeuert wird das Event so oder so.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    ​Bei einer WinForms-App gibt es auch bei einem »Abschuss« das FormClosing-Event.

    Das Problem bei sehr schnellen Rechnern mit SSD ist aber, dass die schneller ausgeschaltet sind als noch eine Datei geschrieben werden könnte.
    Man muss also das Herunterfahren selbst verzögern.

    VB.NET-Quellcode

    1. AddHandler SystemEvents.SessionEnding, AddressOf OnShuttingdown


    VB.NET-Quellcode

    1. Public Sub OnShuttingdown(ByVal sender As Object, ByVal e As SessionEndingEventArgs)
    2. 'Windows wird gerade heruntergefahren, also hier die Daten speichern
    3. SchreibeBenutzer()
    4. SchreibeTische()
    5. EventLog("Windows Shutdown bei laufender Anwendung")
    6. End Sub
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Hi @dive26

    danke Dir für Deinen Beitrag. :)
    Habe diesen gleich in mein Projekt eingebaut.

    Drei Verständnisfragen dazu:
    - Das FormClosing wird auch beim Shutdown durchlaufen, aber u.U. werden nicht alle darin stehenden Aufgaben beim System-Coitus korrekt abgeschlossen?
    - Deine sub OnShuttingDown wird nur beim Shutdown durchlaufen, aber nicht beim normalen Programm-Schliessen?
    - Beim Shuttingdown wird der System-Coitus solange aufgehalten, bis die sub ShuttingDown komplett und korrekt abgearbeitet ist?

    Will ich beim Programmende meine Daten sicher speichern, muss ich also meine "AllesSpeichern"-Sub sowohl im FormClosing-Event (für normales Programmende) und auch im ShuttingDown-Event (für System-Coitus) aufrufen

    VB.NET-Quellcode

    1. Private Sub AllesSpeichern()
    2. My.Settings.Programm_Statistik_MausOMeter_GesamtZähler += statistik_SeitProgrammstart_MouseDistance
    3. My.Settings.Programm_Statistik_Programmlaufzeit_GesamtZähler += statistik_SeitProgrammstart_Programmlaufzeit
    4. My.Settings.Programm_Statistik_ObjekteInternGeöffnet += Statistik_ObjekteInternGeöffnet '
    5. My.Settings.Programm_Statistik_ObjekteExternGeöffnet += Statistik_ObjekteExternGeöffnet '
    6. My.Settings.Programm_Statistik_ObjekteManuellAusClipboard += Statistik_ObjekteManuellAusClipboard '
    7. My.Settings.Programm_Statistik_ObjekteAutomatischAusClipboard += Statistik_ObjekteAutomatischAusClipboard '
    8. My.Settings.Programm_Statistik_OrdnerAusDateisystemImportiert += Statistik_OrdnerAusDateisystemImportiert '
    9. My.Settings.Programm_Statistik_ObjekteAusDateisystemImportiert += Statistik_ObjekteAusDateisystemImportiert '
    10. My.Settings.Programm_Statistik_ObjektinhalteInZwischenablage += Statistik_ObjektinhalteInZwischenablage '
    11. My.Settings.Programm_Statistik_ObjektinhalteAnAnwendungenGesendet += Statistik_ObjektinhalteAnAnwendungenGesendet '
    12. My.Settings.Programm_Statistik_ObjektePerMailVersendet += Statistik_ObjektePerMailVersendet
    13. If MySettingsSpeichernBeiExit = True AndAlso MySettingsGespeichert = False Then
    14. My.Settings.Save()
    15. MySettingsGespeichert = True
    16. End If
    17. SpeichereIconCache()
    18. iconCache.Clear()
    19. ÜberprüfeEditorÄnderungen(, True)
    20. End Sub


    Mit der Variablen MySettingsGespeichert in der Sub AllesSpeichern prüfe ich, ob die MySettings beim Programm-Ende bereits durch das FormClosing-Event gespeichert wurde.
    Denn meine Settings dürfen beim ProgrammEnde nur einmal gespeichert werden, da ich einen Laufzeit-Counter im Programm habe, welcher ansonsten beim Programmende durch Shutdown die aktuelle Laufzeit u.U. sowohl durch den Aufruf im FormClosing-Event, als auch durch den Aufruf des ShutDown-Events auf den gespeicherten Laufzeitwert addieren würde.

    Sehe ich das so richtig?

    Beste Grüsse
    @Dideldum

    Probier es einfach aus und setzte Dir Haltepunkte oder gib eine Logdatei aus.
    Dann siehst Du was alles durchlaufen wird.

    Form.Close verwende ich nicht, weil ich diese aus einem Modul heraus starte und erst wenn das Modul beendet wird, soll alles gespeichert werden.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Hi Ihr 2,

    Danke Euch für die Infos. :)

    @dive26,
    Haltepunkte werden bei mir beim Shutdown ignoriert. Da fährt die Kiste gnadenlos herunter.
    Aber das mit der Log-Datei ist ein guter Vorschlag.
    Das werde ich testen und dann berichten.

    @Haudruferzappeltnoch,
    Ich habe den RemoveHandler in die FormClosed-Routine gepackt.
    Weiss noch nicht, ob beim Shutdown der Handler dabei ausgeführt wird, oder ob der Removehandler vor dem Shutdown den Subaufruf deaktiviert.
    Das muss ich noch austesten.