Форум: "WinAPI";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
ВнизПриложение не дает выключить комп. Найти похожие ветки
← →
Sky (2005-11-07 15:07) [0]При стандартном ручном закрытии приложения никаких проблем нет. Проблемы при попытке перезагрузить систему с активным приложением. Ловлю WM_QUERYENDSESSION, в нем делаю FORMCLOSE. Приложение честно гаснет. Форточки не гаснут. Вот и получается, что юзер вынужден дважды гасить систему - сначала гаснет приложение, со второй попытки - система. Где грабли?
← →
umbra © (2005-11-07 15:28) [1]
> Ловлю WM_QUERYENDSESSION, в нем делаю FORMCLOSE
>
а зачем? винда сама приложение закроет.
← →
Leonid Troyanovsky © (2005-11-07 15:45) [2]
> Sky (07.11.05 15:07)
> приложение, со второй попытки - система. Где грабли?
Неправильный обработчик сообщения.
См. какой result передается inherited.
--
Regards, LVT.
← →
Sky (2005-11-07 15:46) [3]В том и дело, что не закрывает. Если не ловить WM_QUERYENDSESSION, то приложение вообще не закрывается. Ситуация похожая на работу с Tray. Но в этом приложении нестандартных компонентов нет :(
← →
Sky (2005-11-07 15:47) [4]message.result := integer(true)
← →
Leonid Troyanovsky © (2005-11-07 15:51) [5]
> Sky (07.11.05 15:47) [4]
> message.result := integer(true)
Где весь обработчик?
И что происходит в FormClose.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2005-11-07 16:00) [6]
> Sky (07.11.05 15:46) [3]
> В том и дело, что не закрывает. Если не ловить WM_QUERYENDSESSION,
> то приложение вообще не закрывается.
Ошибка в FormClose/FormCloseQuery.
Скорее всего, стоит что-то типа action := caNone.
--
Regards, LVT.
← →
Sky (2005-11-07 16:01) [7]Обработчик -
procedure TMainTCPForm.WMQueryEndSession(var Mes: TWMQueryEndSession);
begin
mes.Result:=integer(true);
inherited;
close;
end;
procedure TMainTCPForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//стоп таймера перерисовки формы
timer1.Enabled:=false;
//гасится два потока
PUDP^.Terminate;
PUDP^.WaitFor;
PTCP^.Terminate;
PTCP^.WaitFor;
//закрывается сокет
netform.ServerSock.Close;
//сохраняется текущее состояние
savestatus;
end;
Ничего необычного...
← →
Sky (2005-11-07 16:09) [8]Вручную задал Action:=caFree; не помогло :(
Кстати, еще одно: при активном приложении последовательность Пуск->Завершение->Перезагрузка выгружает приложение, но не винду, если после этого приложение запустить снова и повторить Пуск->Завершение->Перезагрузка, то глушится и приложение и винда. В мозгах ничего не остается, проверено.
← →
Leonid Troyanovsky © (2005-11-07 16:25) [9]
> Sky (07.11.05 16:01) [7]
> mes.Result:=integer(true);
> inherited;
> close;
> end;
Здесь не место Close, тем более с таким отягощением.
Можешь попробывать PostMessage(Handle, WM_CLOSE, 0, 0).
Хотя, в любом случае, окно получит его позже.
Здесь место лишь таким вещам, как FCanClose := True.
> //стоп таймера перерисовки формы
Что за таймер "перерисовки формы"?
> PTCP^.WaitFor;
Почему WaitFor?
> //закрывается сокет
> netform.ServerSock.Close;
Что за сокет, что за netform?
> //сохраняется текущее состояние
> savestatus;
Сохранить состояние можно и раньше, хоть в OnCloseQuery.
Мне, вообще, не очень верится, что оное приложение
беспроблемно закрывается даже в штатном режиме.
--
Regards, LVT.
← →
Sky (2005-11-07 16:32) [10]
> Здесь не место Close, тем более с таким отягощением
Согласен. Но без этого вообще приложение не закрывается при попытке перезагрузки.
> Что за таймер "перерисовки формы"?
Раз в секунду перерисовывает часть обьектов на форме.
> Почему WaitFor?
Дык... Дождаться завершения потока... А что, туплю?
> Что за сокет, что за netform?
Обычный TServerSocket на дочерней форме.
> Мне, вообще, не очень верится, что оное приложение
> беспроблемно закрывается даже в штатном режиме.
Точно. Прислать, к сожалению, не могу :)
← →
Sky (2005-11-07 16:37) [11]
> Сохранить состояние можно и раньше, хоть в OnCloseQuery.
Вообще я пробовал в OnCloseQuery весь обработчик FormClose перетащить, FormClose вообще отсутствовал - никакого эффекта, все то же самое.
← →
Leonid Troyanovsky © (2005-11-07 16:43) [12]
> Sky (07.11.05 16:32) [10]
> > Здесь не место Close, тем более с таким отягощением
> Согласен. Но без этого вообще приложение не закрывается
> при попытке перезагрузки.
Оно не закрывается, потому как оно не может завершится нормально.
Что происходит при надавливании на крестик главной формы?
В отладчике смотреть, в отладчике.
> > Почему WaitFor?
> Дык... Дождаться завершения потока... А что, туплю?
А оно надо - дожидаться. Что там такого ценного?
> Обычный TServerSocket на дочерней форме.
stNonBlocking?
Чем он занят? Как реагирует на закрытие?
> > Мне, вообще, не очень верится, что оное приложение
> > беспроблемно закрывается даже в штатном режиме.
> Точно. Прислать, к сожалению, не могу :)
Отладчик, отладчик и еще раз отладчик.
Когда будет закрываться без проблем,
тогда и все остальное получится.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2005-11-07 16:50) [13]
> Sky (07.11.05 16:37) [11]
> > Сохранить состояние можно и раньше, хоть в OnCloseQuery.
> Вообще я пробовал в OnCloseQuery весь обработчик FormClose
> перетащить, FormClose вообще отсутствовал - никакого эффекта,
> все то же самое.
А что тоже самое? Если вызывать Close в WMQueryEndSession,
то, конечно.
Однако, повторюсь, проблема не в WMQueryEndSession.
Твое приложение закрывается некорректно.
--
Regards, LVT.
← →
Sky (2005-11-08 10:17) [14]
> Твое приложение закрывается некорректно.
Разобрался. Все закрывается корректно. Просто есть компонент - NMUDP, который и не отпускал приложение. Пришлось его вручную в FORMCLOSE задестроить и все пошло. В качестве проверки соорудил тестовое приложение с единственной формой, на которой был единственный NMUDP. Ни строчки кода, UDP-компонент никак не настраивался даже. И это приложение не дает завершить систему. Плиз, проверьте меня кто-нибудь, если подтвердится - значит баг Борланда.
← →
Leonid Troyanovsky © (2005-11-08 11:37) [15]
> Sky (08.11.05 10:17) [14]
> > Твое приложение закрывается некорректно.
> компонент никак не настраивался даже. И это приложение не
> дает завершить систему. Плиз, проверьте меня кто-нибудь,
> если подтвердится - значит баг Борланда.
Это баг NetMasters.
Кстати, хоть и контрол левый, приложение-то, все равно, твое.
--
Regards, LVT.
← →
Sky © (2005-11-09 11:09) [16]
> Это баг NetMasters.
Не согласен, поскольку
> хоть и контрол левый, приложение-то, все равно, твое.
Раз компонент входит в стандартный пакет Борланда, то он и в ответе :)
Хоть баг и редкий, imho, достоин занесения на скрижали, об него мозги свернуть можно.
← →
Leonid Troyanovsky © (2005-11-09 14:16) [17]
> Sky © (09.11.05 11:09) [16]
> > Это баг NetMasters.
> Не согласен, поскольку
Для оных компонентов (ocx, IMHO), есть свои соглашения о
распространении и т.п.
> Раз компонент входит в стандартный пакет Борланда, то он и в ответе :)
Конечно, они провинились, что до сих пор не выкинули их на свалку.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.04 c