Zum Inhalt springen

[VB.net] Wenn Anwendung sich beendet noch etwas unternehmen.....wie geht das!?


Empfohlene Beiträge

Geschrieben

Hallo liebe Fachinformatiker Community,

ich hab da folgendes Problem:

Ich habe eine Windows Forms Anwendung und diese soll wenn sie beendet wird (durch den User wie durch einen Shutdown / Abmelden von der Windows Sitzung) noch ein, zwei Aktionen ausführen.

Die ApplicationEvents.vb kann ich schonmal nicht verwenden, da meine Anwendung nur als TrayIcon läuft und ich das Anwendungsframework deßhalb deaktiviert habe um keine Form als Startform setzen zu müssen.

Wenn ich die folgenden Handler registriere, reagieren die Funktionen zwar bei normalen beenden, nicht aber wenn die Applikation durch den Garbage Collector aufgeräumt wird:

        

AddHandler Application.ApplicationExit, AddressOf OnApplicationExit

AddHandler Application.ThreadExit, AddressOf OnThreadExit

Wie also muss man das bewerkstelligen, dass bei einer TrayIcon Applikation wenn sie durch Windows geschlossen wird noch Funktionen aufgerufen werden!?

Viele Grüße und vielen Dank im Vorraus!

Fred

Geschrieben

Wieso die Einstellungen nicht speichern wenn sie gemacht werden? Ich sehe jedenfalls keinen Nutzen darin, ausser Mehrarbeit beim Frickeln mit der Win32Api.

@fredthefreezer: Das Ganze geht übrigens mit der Win32Api. Dokumentation findest du im MSDN.

Geschrieben

imo sollte man das spätestens im Close Event des Forms machen, wenn die Anwendung schon schließt kann man auch nicht so 100% sicher sein, wie der State des ganzen ist. Vor allem wäre das Close durch Windows auch beim Shutdown der Fall. Und dann fährt dir mitten im Schreibprozess die Kiste runter. Definitiv keine gute Lösung ;)

Geschrieben (bearbeitet)

Also ich finde das ist ebenfalls eine legitime Lösung.

Es ist ja schön und gut bei einem normalen beenden der Anwendung die Einstellungen zu speichern.

Aber es gibt durchaus scenarien wo beispielsweise der Rechner bei gestarteter Anwendung heruntergefahren wird (da ist das schon sehr hilfreich). Oder wenn die Anwendung per Taskmanager gekillt wird.

Das kann man beim schließen alles abfragen und könnte dann schnell noch die wichtigsten Informationen speichern.

Der IE macht das auch nicht anders. Schonmal bemerkt was passiert wenn ihr im IE9 mehrere Tabs offen habt und dann die Kiste einfach herunterfahrt.

Ganz genau beim nächsten Start sagt er euch das bei der letzten Nutzung was schief lief und ob ihr die Tabs der letzten Sitzung wiederherstellen möchtet.

Bearbeitet von Gateway_man
Geschrieben (bearbeitet)

Nein so arbeitet der IE sicherlich nicht. Er hat wahrscheinlich eine Embedded DB und hat eine Tabelle in der er alle aktiven Seitenaufrufe einträgt. Schließt man den Tab, so wird auch der Eintrag entfernt. Sollten sich nun beim Starten des IE Sachen in der Tabelle befinden, geht er davon aus das etwas schief gegangen ist und meldet es dem Benutzer.

Alles andere macht, wie SilentDemise schon gesagt hat wenig Sinn. Niemand kann gewährleisten, dass wirklich noch alle Sachen ausgeführt/gespeichert werden.

Bearbeitet von trollr
Geschrieben

Wobei das über den Taskmanager nur funktioniert solange du den Task und nicht den Prozess selber beendest.

Und dann fährt dir mitten im Schreibprozess die Kiste runter. Definitiv keine gute Lösung ;)

Windows sendet beim Herunterfahren an alle Anwedungen eine Nachricht das sie sich beenden sollen und wartet dann darauf das diese das tun. Wenn das zu lange dauern sollte erscheint normalerweise der Dialog das Anwendung xy noch offen ist und nicht reagiert. Wenn der Benutzer dann natürlich auf Anwendung beenden klickt würden auch evtl. schreibvorgänge unterbrochen werden.

So lange man da aber nix riesen großes macht sollte der Benutzer gar nichts davon mitbekommen, ansonsten weiß ers dann beim nächsten mal das er die Anwendung selber richtig beenden soll oder sie zumindest beim Herunterfahren nicht abschießen soll ;)

Geschrieben

Naja wenn du das denkst. Lass ich dir dein Glauben. Warum sollten solchen Funktionen existieren wenn Sie "böse" sind.....

@Te:

Du kannst natürlich auch alle Sekunden deine Einstellungen speichern lassen oder nur auf Änderung, allerdings kann das unter Umständen zu enormen overhead führen. Je nachdem welcher Umfang dein Projekt hat.

Geschrieben

Hier geht es nicht um glauben, sondern um Wissen. Natürlich gibt es Shutdown Events und natürlich funktioniert das Ganze auch aber die sind für ganz andere Dinge implementiert wurden. Wenn eine Applikation hängt oder sich selbst killt hast du keinen Möglichkeit das ganze zu verzögern oder dazwischen zu hooken. Wichtige Daten gehen verloren und das nur weil man vorher nicht richtig darüber nachgedacht hat.

Geschrieben

Ich verstehe eure Argumentation, die macht auch durchaus Sinn, man sollte aber 2 Punkte beachten:

1. betrifft das Argument von Guybrush: wenn der PC mit dem Force Parameter heruntergefahren wird, z.b. durch einen Admin hast du die Signalisierung in dieser Form nicht. Dort kann es dann zu inkonsistenten Datenbankeinträgen kommen.

2. Man sollte auch betrachten was der User erwaret. Wenn ich als User einen Prozess über den Taskmanager kille, dann erwarte ich nicht, dass er noch Einträge abspeichert. In manchen Fällen führe ich das auch bewußt herbei, z.B. bei Winamp wenn ich mir die Playlist zerschossen habe. Per Prozess killen speichert er die Änderungen nicht und stellt mir die Werte vom vorherigen Aufruf wiederher.

Fazit: Man sollte dringen auch drauf achten wie Programme normalerweise auf einen Taskkill reagieren um die User Experience einheitlich zu halten. Speicher bei Process Kill ist kein normales Verhalten und sollte daher sehr vorsichtig eingesetzt werden.

Geschrieben

dass fredthefreezer Daten speichern will, ist bisher nur Spekulation, da er nicht geschrieben hat, was er machen möchte

der Client für TeamSpeak (Version 3) beendet beim Herunterfahren ordnungsgemäß die Verbindung zum Server

das ist eine Aktion, wie sie fredthefreezer vielleicht ebenfalls durchführen will

der Server könnte durchaus auch durch das nicht-antworten feststellen, dass die Verbindung verloren gegangen ist, allerdings kann dies eine Weile dauern (und es ist einfach nicht so sauber)

es ist aber, wie bereits erwähnt, wichtig darauf zu achten, dass das Verhalten des Programms nicht zu abwegig durch unsinnige Aktionen (Speichervorgänge) wird

beispielsweise sollten automatisch gespeicherte Daten, deren Speicherung vom Benutzer nicht bestätigt wurde, beim nächsten Programmstart nicht wie normal gespeicherte Daten behandelt werden

Geschrieben (bearbeitet)

Danke für eure wirklich sehr anregende Diskussion :)

Und ich meine nein, ich habe keinen Designfehler.

Mein Programm tut genau das was es soll. Es handelt sich bei dem Programm um ein Zeiterfassungstool, das beim Beenden von Windows, oder eben dem Programm noch eine "Gehen" Zeit stempeln soll. Wo da der Designfehler sein soll kann ich nicht nachvollziehen.....

Ich habe mittlerweile auch eine Lösung des Ganzen gefunden, nämlich mit:


Imports Microsoft.Win32


    Public Sub Main

        AddHandler SystemEvents.SessionEnding, AddressOf OnShuttingdown

        'Rest of app, including the While Loop to do it's thing

    End Sub


    Public Sub OnShuttingdown(ByVal sender As Object, ByVal e As SessionEndingEventArgs)

        'Code that signal's app's exiting which in turn sets a variable that tells the While Loop to exit

    End Sub

by Fred

Bearbeitet von fredthefreezer
Lösung
Geschrieben (bearbeitet)

D.h jedesmal wenn jemand seinen Rechner rebootet, was bei Entwicklern durchaus regelmäßig passieren kann, wird der Mitarbeiter ausgestempelt?

Ich würde mich da beschweren. Aber wenn es so gefordert wird, mir soll es gleich sein. Gut gelöst finde ich es jedoch trotzdem nicht.

Bearbeitet von trollr
Geschrieben
D.h jedesmal wenn jemand seinen Rechner rebootet, was bei Entwicklern durchaus regelmäßig passieren kann, wird der Mitarbeiter ausgestempelt?

Ich würde mich da beschweren. Aber wenn es so gefordert wird, mir soll es gleich sein. Gut gelöst finde ich es jedoch trotzdem nicht.

Oh geh woanders trollen bitte!

Ich hole mir bei der Anzeige der Daten natürlich den MAX bzw den MIN Wert aus der DB!

by Fred

Geschrieben

Ich weiß auch nicht was man durch das holen des Max/Min Wer gewonnen hat. Ich reboote auch oft mal obwohl meine Regelsarbeitszeit rum ist. Aber ich denke hier weiter zu diskutieren macht wenig Sinn. Eine Wand ist einsichtiger und kritikfähiger.

Gast
Dieses Thema wurde nun für weitere Antworten gesperrt.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...