2013-10-05 31 views

Odpowiedz

7

Jeśli używasz pętlę zdarzeń Qt, można złapać następujący sygnał:

void QCoreApplication :: aboutToQuit() [sygnał]

Ten sygnał jest emitowany, gdy aplikacja ma zamiar zamknąć główną pętlę zdarzeń, np gdy poziom pętli zdarzeń spadnie do zera. Może się to zdarzyć po wywołaniu funkcji quit() z wnętrza aplikacji lub po zamknięciu przez użytkownika całej sesji pulpitu. Sygnał jest szczególnie przydatny, jeśli aplikacja musi wykonać kilka ostatnich porządków. Pamiętaj, że w tym stanie nie jest możliwa interakcja użytkownika.

Poza tym, być może szukasz dla następujących komunikatów poniżej jeśli wspomniany sygnał nie jest odpowiednie dla Twojego przypadku użycia:

WM_QUIT: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632641(v=vs.85).aspx

WM_CLOSE: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632617(v=vs.85).aspx

WM_QUERYENDSESSION : http://msdn.microsoft.com/en-US/library/windows/desktop/aa376890.aspx

WM_ENDSESSION: http://msdn.microsoft.com/en-US/library/windows/desktop/aa376889.aspx

2

myślę innych odpowiedzi całkowicie przegap punkt: Kiedy przymusowo zakończyć aplikację, to jak SIGKILL na Unix. Nie ma sposobu, aby sobie z tym poradzić - z wyjątkiem przed czasem. Co mam na myśli, traktując je z wyprzedzeniem, upewniając się, że zapiszesz ustawienia za każdym razem, gdy zostaną zmienione. Oczywiście możesz zoptymalizować to zachowanie, na przykład zapisać ustawienia co kilka sekund, jeśli są brudne, jeśli chcesz zminimalizować liczbę dostępów do dysku (pomyśl zużycie energii na urządzeniach mobilnych).

Wiele z nich jest obsługiwanych przez użytkownika QSettings. Dopóki używasz QSettings, otrzymasz rozsądne zachowanie. Jeśli sam zapisujesz pliki, użyj QSaveFile, ponieważ zajmuje się opróżnieniem pliku i przybliżeniem zastępowania pliku atomowego, aby nie utracić ustawień, jeśli zabicie (wymuszone zakończenie) pojawi się w trakcie pisania.

Sygnał aboutToQuit emitowany przez QCoreApplication jest tym, na co chcesz reagować, jeśli chcesz po prostu zrobić coś, gdy aplikacja zostanie poproszona o zamknięcie. Jest to równoważne z obsługą wiadomości WM_QUIT, lub obsługą SIGTERM na systemie Unix. Zrobienie tego w specyficzny dla platformy sposób jest bezcelowe, ponieważ Qt robi to już dla ciebie. Nie ma również sensu zajmować się WM_CLOSE, ponieważ jest to wiadomość, którą otrzymują tylko okna, i znowu Qt już ją obsługuje.

Możesz również uczestniczyć w procesie wylogowywania/zamykania, instalując QAbstractNativeEventFilter i przetwarzając WM_ENDSESSION i WM_QUERYENDSESSION. Ma to sens tylko, jeśli chcesz wiedzieć z wyprzedzeniem, że aplikacja zostanie zamknięta.Jeśli wyraźnie nie chcesz zatrzymać wyłączania/wylogowywania, nie musisz się tym martwić.

+0

Nie wiedziałem abouttoQuit obsługuje SIGTERM na Linux, ale co SIGHUP & SIGINT, SIGHUP jest zazwyczaj wysyłane do aplikacji na wylogowania w systemie Linux, dlatego użyłem obsługi sygnałów (Qt way platform specific) na Linuksie –

+0

Nic na temat tego pytania nie mówi, że aplikacja została przymusowo zakończona. Wymienia "SIGTERM", który jest wdzięcznym sygnałem wyłączenia, a nie "SIGKILL". – qris