fredthefreezer Geschrieben 29. November 2011 Geschrieben 29. November 2011 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
trollr Geschrieben 30. November 2011 Geschrieben 30. November 2011 Wieso sollte man sowas wollen? Ich tippe mal stark auf Designfehler
Guybrush Threepwood Geschrieben 30. November 2011 Geschrieben 30. November 2011 Wieso ist es ein Designfehler vor dem Beenden des Programms zum Beispiel noch Einstellungen oder andere Dinge wegspeichern zu wollen?
trollr Geschrieben 2. Dezember 2011 Geschrieben 2. Dezember 2011 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.
SilentDemise Geschrieben 2. Dezember 2011 Geschrieben 2. Dezember 2011 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
Gateway_man Geschrieben 2. Dezember 2011 Geschrieben 2. Dezember 2011 (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 2. Dezember 2011 von Gateway_man
trollr Geschrieben 2. Dezember 2011 Geschrieben 2. Dezember 2011 (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 2. Dezember 2011 von trollr
Guybrush Threepwood Geschrieben 2. Dezember 2011 Geschrieben 2. Dezember 2011 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
Gateway_man Geschrieben 2. Dezember 2011 Geschrieben 2. Dezember 2011 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.
trollr Geschrieben 2. Dezember 2011 Geschrieben 2. Dezember 2011 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.
SilentDemise Geschrieben 2. Dezember 2011 Geschrieben 2. Dezember 2011 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.
Sacaldur Geschrieben 2. Dezember 2011 Geschrieben 2. Dezember 2011 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
fredthefreezer Geschrieben 7. Dezember 2011 Autor Geschrieben 7. Dezember 2011 (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 7. Dezember 2011 von fredthefreezer Lösung
trollr Geschrieben 7. Dezember 2011 Geschrieben 7. Dezember 2011 (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 7. Dezember 2011 von trollr
fredthefreezer Geschrieben 7. Dezember 2011 Autor Geschrieben 7. Dezember 2011 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
SilentDemise Geschrieben 7. Dezember 2011 Geschrieben 7. Dezember 2011 Wieso trollen? Das ist doch durchaus ein berechtigter Einwand? Wie gesagt, was passiert denn bei einem shutdown -f?
trollr Geschrieben 7. Dezember 2011 Geschrieben 7. Dezember 2011 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.
grueni Geschrieben 7. Dezember 2011 Geschrieben 7. Dezember 2011 Da hier nicht mehr auf sachlicher Ebene diskutiert wird und das Problem des Threaderstellers gelöst ist: -> closed
Empfohlene Beiträge