![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый день! Вопрос.
В событии OnClose программы отсылается udp пакет на сервер, мол, программа закрыта. Но если закрывать программу с помощью диспетчера задач, то событие не выполняется, я искал по теме в гугле, читал книги, но ничего не нашёл. Подскажите пожалуйста новичку как сделать так чтобы при закрытии приложения через диспетчер задач всё равно выполнялись необходимые функции! |
|
#2
|
||||
|
||||
|
OnCloseQuery.
|
|
#3
|
|||
|
|||
|
Цитата:
![]() |
|
#4
|
|||
|
|||
|
На самом деле - практически никак.
Более того, OnClose и OnCloseQuery могут не сработать дяже просто при закрытии сессии (сам "нарвался"). Если разговор идет о закрытии через Диспетчер задач, то надо хукать TerminateProcess, который, на самом-то деле, сам убиваемый процесс и не спрашивает ниочем. Просто гасит без всякой жалости. Тут лучше построить другую схему, т.к. существующая все-равно не защитит от всех возможный способов/причин умирания процесса. Лучше пусть приложение периодически посылает пакет, что оно все еще живо, а сервер просто проверяет когда последний раз пришел такой пакет и принисает решение - жив клиент или нет. |
|
#5
|
||||
|
||||
|
При закрытии сессии можно из-под WMQueryEndSession слать, до установки результата в единицу ( Msg.Result:= 1; )
а в OnCloseQuery так Код:
procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin ... // вот здесь шлём CanClose:= true; end; |
|
#6
|
||||
|
||||
|
на самом деле и OnClose и OnCloseQuery вызываются, если диспетчером снять задачу (вкладка Приложения), а не завершить процесс (вкладка Процессы).
|