Seite 1 von 1

Code ausführen, wenn System heruntergefahren wird

Verfasst: 2. Februar 2009 17:15
von wijaa
Hallo!

ich habe folgendes Problem:

mein Programm läuft hauptsächlich im System Tray, Fenster ist (die meiste Zeit) keines geöffnet. Wenn man das Programm beendet (etwa über das Kontextmenü des System-Tray-Icons) wird ein Eintrag in einer Art Log-Datei geschrieben.

Fährt der Benutzer nun aber den Rechner herunter, schreibt das Programm keinen Eintrag in das Logfile, was es aber tun sollte. Ich habe entsprechenden Code zwar im Destruktor des Hauptfensters (MainForm, ein QMainWindow) stehen, der Code wird aber nicht aufgerufen (warum nicht?).

QSystemTrayIcon kennt kein CloseEvent(), das man überladen könnte.

Und der Versuch, QCoreApplication::aboutToQuit() abzufragen, hat auch nicht geklappt:

Code: Alles auswählen

connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(saveToFile()));
Windows-Events möchte ich eigentlich auch nicht abfragen. Habe ich aber auch mit diesem Code erfolglos versucht:

Code: Alles auswählen

virtual bool MainForm::winEventFilter(MSG* msg, long* result) {
      if(msg->message == WM_QUERYENDSESSION) {
         *result = 1;
         saveToFile();
         return true;
      }
      return false;
 };
Vielleicht kennt ihr ja noch eine Variante, die ich noch probieren könnte.

Stutzig macht mich, dass der Code im Destruktor nicht aufgerufen wird, wenn das System herunterfährt. Sollte der Code nicht in jedem Fall gestartet werden, schließlich muss der Destruktur ja aufgerufen werden, wenn die Instanz dealloziert wird?!

Grüße
wijaa

Verfasst: 2. Februar 2009 19:28
von upsala
Du könntest dir ja mal die Events mitprotokollieren, die dein QSystemTrayIcon so bekommt. Vielleicht findet sich da was.

Verfasst: 3. Februar 2009 14:48
von wijaa
Das Signal "aboutToQuit" muesste doch genau das sein, was ich abzufangen habe, oder verstehe ich die Hilfe falsch? "This may happen either after a call to quit() from inside the application or when the users shuts down the entire desktop session."

Gebt bitte einen Hinweis, ob ich mit "aboutToQuit" auf der richtigen Spur bin, dann debugge ich in diese Richtung weiter.

Verfasst: 3. Februar 2009 14:50
von CLRS530
Nein, bist du wohl nicht, da das nichts mit dem System, sondern mit dem Programm zu tun hat.
Wenn du jetzt natürlich vorhast das Programm nie manuell zu Beenden sondern es immer(!) vom System beim Herunterfahren beendet wird, könntest du damit Erfolg haben.
Andererseits könnte es sein, das dieses Ereignis bei einem "normalen" Schließvorgang gar nicht ausgelöst wird. Einen Versuch ist es sicherlich wert.