Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
ВнизApplication.Terminate Найти похожие ветки
← →
a3a3ello (2004-06-05 18:50) [0]Не могу завершить приложение с помощью Application.Terminate. Программа благополучно продолжает работать дальше. В чем дело?
Спасибо.
← →
ikivio © (2004-06-05 19:36) [1]Код в студию !
← →
YurikGl © (2004-06-05 19:39) [2]ikivio © (05.06.04 19:36) [1]
Может аппликейшн другой?
← →
a3a3ello (2004-06-05 19:51) [3]аппликейшн у меня один.
А на счет кода. В одном из модулей есть процедура которая посылает сообщение об ошибке и завершает работу (должна завершать). Процедура вызывается из других процедур того же модуля. Может дело в том, что процедуры вложены несколько раз одна в другую ?
procedure SendErrorMSGandQuit();
begin
Report(ErrTXT, GetDataForMail(0));
Application.Terminate;
end;
← →
Petr V. Abramov © (2004-06-05 20:21) [4]
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated;
Это цитата из TApplication.Run
Application.Terminate всего лишь выставляет флажок Terminated, по которому прекращается цикл обработки сообщений. И от момента его выставления до момента проверки может пройти года 3 ( если приложение чего-то ждет)
Это одно из напрвлений копания.
← →
a3a3ello (2004-06-05 20:32) [5]2Petr V. Abramov
Мое приложение ни чего не ждет. Оно продолжает работать как будто ни чего не произошло. Terminated я проверял оно стоит False.
← →
Marser © (2004-06-05 20:36) [6]
> Может аппликейшн другой?
Прикольно... Если такое и возможно(в чем сомневаюсь), подобные вопросы вряд ли бы возникли.
← →
lyeh © (2004-06-06 00:21) [7]Может в Form.OnCloseQuery чего не так, вроде CanClose:=FALSE
← →
KilkennyCat © (2004-06-06 00:25) [8]Значит, просто не доходит вызов до него.
procedure SendErrorMSGandQuit();
begin
Report(ErrTXT, GetDataForMail(0));
Showmessage("ща вырублюсь");
Application.Terminate;
end;
← →
DrPass © (2004-06-06 00:53) [9]
> Оно продолжает работать как будто ни чего не произошло
Работать - в смысле обрабатывать сообщения пользователя? Нонсенс.
Или все-таки она что-то считает в "зависшем" положении? Тогда все правильно - выход осуществится лишь после окончания
← →
Ihor Osov'yak © (2004-06-06 00:58) [10]2 a3a3ello
Вероятнее всего, у вас присутствует некая излишняя увлеченность Application.ProcessMessages или иные способы организации альтернативного цыкла выборки сообщений + некоторая неаккуратность в реализации архитектуры приложения.
Поставте точку прерывания в SendErrorMSGandQuit, при срабатывании этой точки проанализируйте стек (Ctrl+F3) - возможно у Вас в стеке будет присутствовать несколько Application.ProcessMessages - тогда ситуацию вашу можно обьяснить. Application.Terminate приведет к вызову PostQuitMessage(0), который "перебьет" только внутренний Application.ProcessMessages. Конечно, флажок Application.Terminated при этом будет выставлен, но дело в том, что "внутренние" Application.ProcessMessages никак этого флажка не анализируют.. И на этих "внутренних" Application.ProcessMessages приложение может "жить" довольно долго.. Лишь бы сообщения поступали, чтобы цыкл внутри ProcessMessages из-за отсутствия сообщений не прерывался..
← →
Ihor Osov'yak © (2004-06-06 01:03) [11]2 [9] DrPass © (06.06.04 00:53)
Ну почему же?
Смотрим этот псевдокод:
Application.Terminate;
while TRUE do begin
<что-то немножко делаем или считаем>
Application.ProcessMessages;
end;
Здесь будет происходить примерно то, что описно в топике.
Конечно, в автора это может быть оформлено не в столь явном виде, но очень вероятно, что такой шедевр присутствует.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.031 c