Przesyłam aplikację dla systemu Linux do systemu Windows zapisaną w Qt. Aplikacja musi zapisać niektóre ustawienia przed zamknięciem. W Linuksie możemy to zrobić za pomocą programów obsługi sygnałów dla SIGTERM itd. Jak mogę zaimplementować to samo w systemie Windows.Jak wykrywać zamknięcie systemu Windows lub wylogowanie w Qt
Odpowiedz
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
Nie wiem Qt. Jeśli możesz pozwolić sobie na komunikaty w systemie Windows, tylko wiadomości od WM_QUERYENDSESSION
i WM_ENDSESSION
mogą być słuszne.
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ą Nie ma również sensu zajmować się SIGTERM
na systemie Unix. Zrobienie tego w specyficzny dla platformy sposób jest bezcelowe, ponieważ Qt robi to już dla ciebie.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ć.
Myślę, że lepiej będzie obsłużyć sygnał QApplication::commitDataRequest (lub QGuiApplication::commitDataRequest w Qt5) zamiast oToQuit. Wystarczy podłączyć sygnał do swojej funkcji, aby zapisać ustawienia.
Poniżej kilka podobnych dyskusje: http://qt-project.org/forums/viewthread/33329
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 –
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