Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.01.2014, 01:14
Thundefined Thundefined вне форума
Прохожий
 
Регистрация: 11.12.2013
Сообщения: 22
Версия Delphi: delphi 7
Репутация: 10
По умолчанию Выполнение событий если программа уничтожается диспетчером задач

Добрый день! Вопрос.
В событии OnClose программы отсылается udp пакет на сервер, мол, программа закрыта. Но если закрывать программу с помощью диспетчера задач, то событие не выполняется, я искал по теме в гугле, читал книги, но ничего не нашёл. Подскажите пожалуйста новичку как сделать так чтобы при закрытии приложения через диспетчер задач всё равно выполнялись необходимые функции!
Ответить с цитированием
  #2  
Старый 03.01.2014, 01:25
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

OnCloseQuery.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 03.01.2014, 16:36
Thundefined Thundefined вне форума
Прохожий
 
Регистрация: 11.12.2013
Сообщения: 22
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
OnCloseQuery.
Нет, причём тут OnCloseQuery? И нет, этот способ не работает
Ответить с цитированием
  #4  
Старый 03.01.2014, 18:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

На самом деле - практически никак.
Более того, OnClose и OnCloseQuery могут не сработать дяже просто при закрытии сессии (сам "нарвался"). Если разговор идет о закрытии через Диспетчер задач, то надо хукать TerminateProcess, который, на самом-то деле, сам убиваемый процесс и не спрашивает ниочем. Просто гасит без всякой жалости.

Тут лучше построить другую схему, т.к. существующая все-равно не защитит от всех возможный способов/причин умирания процесса. Лучше пусть приложение периодически посылает пакет, что оно все еще живо, а сервер просто проверяет когда последний раз пришел такой пакет и принисает решение - жив клиент или нет.
Ответить с цитированием
  #5  
Старый 05.01.2014, 08:06
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

При закрытии сессии можно из-под WMQueryEndSession слать, до установки результата в единицу ( Msg.Result:= 1; )

а в OnCloseQuery так
Код:
procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 begin
... // вот здесь шлём

CanClose:= true; 
end;
если делать быстро, то сработает
Ответить с цитированием
  #6  
Старый 05.01.2014, 13:26
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

на самом деле и OnClose и OnCloseQuery вызываются, если диспетчером снять задачу (вкладка Приложения), а не завершить процесс (вкладка Процессы).
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:14.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter