[c++] Wykrycie eventu zakończenia aplikacji przez usera.

0

Witam,

Moje pytanie jest krótkie: jak aplikacja może wykryć że zostaje zamknięta przez system/użytkownika.

Przed zamknięciem aplikacji musi ona pozamykać połączenia TCP, rozłączyć się z bazą danych i zapisać log do pliku. Przy normalnym przebiegu aplikacji wszystko jest ok, jeśli użytkownik w trakcie naciśnie przycisk konsolowego okienka: zamknij (lub pod linuxem wciśnie kombinację Ctrl+c) to działanie aplikacji zostaje przerwane. Zanim to się stanie potrzebuję uruchomić funkcję sprzątającą.

Potrzebuję takiego mechanizmu dla linuxa i windowsa.

Edit:
-Program jest napisany w C++ (kompilowany w gcc).
-Program jest aplikacją konsolową.

0

Obsłuż wiadomość WM_QUERYENDSESSION: http://msdn.microsoft.com/en-us/library/aa376890%28VS.85%29.aspx

0

Podałem za mało informacji o programie mój błąd, jest to aplikacja konsolowa, nie ma własnego okienka i piszę w c++ bez .net.

Przykład z zamykaniem przez przycisk zamknij jest trochę mylący, potrzebuję dać aplikacji możliwość wykrycia że system chce zabić jej proces.

Edit:
Rozwiązaniem mojego problemu jest biblioteka csignal (signal.h): http://www.cplusplus.com/reference/clibrary/csignal/

0

nie ma takiej możliwości. na prośbę o zamknięcie procesu możesz zareagować, na zabicie nigdy (chyba, że z pomocą drugiego procesu, ale to bardzo komplikuje sprawę wykonania operacji na danych innego procesu, który już nie istnieje; o uchwyty i połączenia nie musisz się martwić, zwolni/zamknie je system operacyjny).

0
ŁF napisał(a)

nie ma takiej możliwości. na prośbę o zamknięcie procesu możesz zareagować, na zabicie nigdy (chyba, że z pomocą drugiego procesu, ale to bardzo komplikuje sprawę wykonania operacji na danych innego procesu, który już nie istnieje; o uchwyty i połączenia nie musisz się martwić, zwolni/zamknie je system operacyjny).
jemu niekoniecznie chodzi o zabicie procesu tylko o ctrl c w konsoli. to da sie obsluzyc signalami.

0
olo16 napisał(a)

jemu niekoniecznie chodzi o zabicie procesu tylko o ctrl c w konsoli. to da sie obsluzyc signalami.
owszem, da się (pod linuksem). niestety umiem przeczytać tylko to, co autor postu napisał, a nie to co pomyślał:

potrzebuję dać aplikacji możliwość wykrycia że system chce zabić jej proces.

0

Dzięki za odpowiedzi.

Racja, zabicia procesu nie da się obsłużyć (a przynajmniej nie powinno się go obsługiwać z wnętrza aplikacji), ale w dalszym ciągu pozostaje problem zamknięcia aplikacji przez system/użytkownika.

Rozwiązaniem tego problemu jest biblioteka csignal (signal.h): http://www.cplusplus.com/reference/clibrary/csignal/
Programistom VS przyda się funkcja SetConsoleCtrlHandler: http://msdn.microsoft.com/en-us/library/ms686016(VS.85).aspx

Ps.:
Szukając rozwiązania spotkałem się z opiniami że nie zaleca się wykonywania wielu operacji w przypadku takiego opuszczenia aplikacji. Większość dzisiejszych systemów operacyjnych dba o zwalnianie zasobów które wykorzystywał proces i nie trzeba się tym martwić (np. otwarte pliki), są zasoby które nie są przydzielane przez system a przez różne API (np. DX) i tutaj my musimy zająć się zwolnieniem tych zasobów. Nie zmienia to faktu że powinno się zwalniać wszystkie wykorzystywane zasoby choćby dla wyrobienia dobrego nawyku. Źródło: http://www.gamedev.net/community/forums/topic.asp?topic_id=563599

0

Na zwalnianie zasobów najlepsze jest RTTI

0

Chyba RAII, nie RTTI...

0
deus napisał(a)

Chyba RAII, nie RTTI...
[wstyd] Ale walnąłem... Oczywiście, chodziło mi o RAII.

1 użytkowników online, w tym zalogowanych: 0, gości: 1