Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.16;
Скачать: CL | DM;

Вниз

Завершение программы через Halt   Найти похожие ветки 

 
И. Павел   (2009-06-17 13:22) [0]

Здравствуйте.

После вызова Application.Terminate все равно выполняются следующие за ним команды. Можно добавить Exit (но тогда продолжит выполняться вызвавшая функция) или Abort (но он может перехватиться в finally). Halt, вроде бы, работает так, как мне нужно, завершая программу и не выполняя лишних команд, но в справке написано, что он "Initiates abnormal termination of a program.", а в учебнике сказано, что halt, главным образом, используется в консольных программах, а в остальных можно использовать Terminate. Подскажите, пожалуйста, можно ли использовать Halt вместо Application.Terminate (ну и вместо MainForm.Close, когда не нужно выполнять OnClose), если нужно завершить выполнение программы, не обязательно "adnormal" и нет ли здесь каких то "подводных камней" (нормально ли высвободится память, не будет ли Windows как то по особому обрабатывать такой выход, писать о нем в журнал или куда то еще)?


 
turbouser ©   (2009-06-17 13:25) [1]

В очень редких случаях - можно.


 
Сергей М. ©   (2009-06-17 13:27) [2]


> После вызова Application.Terminate все равно выполняются
> следующие за ним команды
> не обязательно "adnormal


Ты считаешь, что в случае normal termination в этом есть что-то непотребное ?


 
Игорь Шевченко ©   (2009-06-17 13:32) [3]

Можно. Результат будет такой же, как при снятии через диспетчер задач, то есть, захваченные ресурсы система всегда освободит, а что до логики приложения - ну убили...


 
jack128_   (2009-06-17 13:35) [4]


> Результат будет такой же, как при снятии через диспетчер
> задач, то есть

При халте вызываются все секции файнализации модулей, всякие System.ExitProc и тому подобное. ПРи снятии через диспетчер такого не происходит..


 
И. Павел   (2009-06-17 13:37) [5]


> Сергей М.

Не знаю. Поэтому и спрашиваю. Просто в справке по Delphi почему-то написали именно так. Раньше использовал Application.Terminate, пока не столкнулся с ситуацией, когда программа продолжила выполняться после этой команды.

turbouser ©, Сергей М. ©, Игорь Шевченко © Спасибо!


 
Сергей М. ©   (2009-06-17 13:41) [6]


> в справке по Delphi почему-то написали именно так


Вот именно - как ?


 
И. Павел   (2009-06-17 13:44) [7]


> Сергей М. ©


В справке по DBS 2005 в главе "Standard Routines and I/O" в таблице "Other Standard Routines":
Halt   Initiates abnormal termination of a program.


 
Сергей М. ©   (2009-06-17 13:52) [8]


> И. Павел   (17.06.09 13:44) [7]


Я вообще-то про нормальную терминацию и конкретно метод TApplication.Terminate, на который ты пожаловался как якобы на неблагонадежный


> использовал Application.Terminate, пока не столкнулся с ситуацией, когда программа продолжила выполняться после этой команды


Мол, "я ему верил, думал он всегда немедля завершит мое приложения, а он такой-сякой вероломный, взял да и подложил мне свинью"

Я ведь именно так понял тебя)


 
И. Павел   (2009-06-17 13:56) [9]


> Сергей М. ©


Нет, я про halt. Про Terminate в справке я уже прочитал, что

> Terminate is not immediate.


 
Cobalt ©   (2009-06-17 14:35) [10]


> И. Павел   (17.06.09 13:37) [5]

Всё зависит от того, надо тебе программу корректно завершить, типа довести её по лестнице до выходной двери, или ты хочешь её скинуть с N-го этажа и не париться.


 
test ©   (2009-06-17 18:37) [11]

И. Павел   (17.06.09 13:44) [7]

ИМХО
Halt   Initiates abnormal termination of a program. = аварийно завершает выполнение программы.


 
test ©   (2009-06-17 18:44) [12]

test ©   (17.06.09 18:37) [11]
В том смысле что нормальное подолжение не возможно(в том числе закрытие) и нужно срочно потушить прогу.


 
TUser ©   (2009-06-18 06:57) [13]

Скажем, если ты пишешь что-то в файл, то оно пишется на самом деле в буфер, который переодически скидывается на диск. Так вот при нормальной терминации будет произедена процедура закрытия файла, и данне из буфера окажутся на диске, а после halt - программа просто умрет, и часть данных может быть потеряна.


 
Riply ©   (2009-06-18 08:33) [14]

> [3] Игорь Шевченко ©   (17.06.09 13:32)
> то есть, захваченные ресурсы система всегда освободит

"Меня терзают смутные сомения" (с) :)
Откуда у нас может быть такая (что система подчистит любые ресурсы) уверенность ?


 
И. Павел   (2009-06-18 08:48) [15]

Всем спасибо за помощь. Думаю, лучше заменю
Halt
на
Application.Terminate;
Abort;

на всякий случай.


 
MonoLife ©   (2009-06-18 09:04) [16]


> После вызова Application.Terminate все равно выполняются
> следующие за ним команды. Можно добавить Exit (но тогда
> продолжит выполняться вызвавшая функция) ...

Имхо, немного подправить логику, то после можно и exit..
Если вы подразумеваете в определенном месте аварийное завершение своего приложения, постарайтесь построить логику так, чтобы Application.Terminate был более-менее конечной точкой процедуры..


 
@!!ex ©   (2009-06-18 09:12) [17]

У мну в проге тоже есть подобный костыль:
int main(void){
 osal::CreateConsole();
 cMain* Main = new cMain();
 Main->Start();
 osal::CloseConsole();

 TerminateProcess(GetCurrentProcess(),0); //Это жесть конечно, но я х.з. почему оно не хочет завершаться.
 return 0;
};

после return 0 без Terminate приложение продолжает выполняться.. Исследование показало, что это возможно потому что есть живой поток... Да вот только я никаких потоков не создаю, а все ресурсы(вроде бы) корректно освобождаю...


 
Loginov Dmitry ©   (2009-06-18 09:45) [18]


> после return 0 без Terminate приложение продолжает выполняться.
> . Исследование показало, что это возможно потому что есть
> живой поток... Да вот только я никаких потоков не создаю,
>  а все ресурсы(вроде бы) корректно освобождаю...


Так бывает иногда. При очень детальном исследовании обычно удается найти виновного. А если нет, то деваться некуда, приходится употреблять
Halt / ExitProcess(0) / TerminateProcess(DWORD(-1), 0) (последнее не подводит)))


 
TIniFile   (2009-06-18 15:03) [19]


> можно ли использовать Halt вместо Application.Terminate

Можно. Более того, вызов Application.Terminate приводит к вызову Halt с нулевым кодом. И даже ещё более, все дельфийские программы всегда завершаются вызовом _Halt0, а Halt, как известно, ничего не делает, кромке установки кода завершения и вызова _Halt0. По крайней мере, по D7 включительно.


 
Loginov Dmitry ©   (2009-06-18 15:25) [20]


> вызов Application.Terminate приводит к вызову Halt с нулевым
> кодом


А если точнее, то после вызова Application.Terminate происходит завершение работы метода Application.Run, далее выполняется весь код, находящийся после Application.Run (если есть), затем финализация всех модулей проекта, ну а в самом конце - завершение работы программы с нулевым кодом ))


 
Mystic ©   (2009-06-18 15:50) [21]

Завершить программу можно всякими способами. Очень часто перед завершением программы надо выполнить ряд действий: сохранить настройки, закрыть соединение с сервером и т. п. Зачастую этот код помещается в обработчиках вроде OnDestroy и т. п. Application.Terminate служит, таким образом, максимально мягкому завершению программы: т. е. мы сообщаем, что программа должна завершиться. Ну и как только будет для этого подходящее время, VCL завершит ее.

Для нормальных приложений вызов Application.Terminate наиболее правильный путь. Если у тебя при этом, например, проявляется дополнительный эффект, например выполняется код, который спрашивает о том, стоит или нет закрывать приложение, то, возможно, надо подправить этот код.

Поскольку программисту могут понадобится и более жесткие средства для завершения программы, например по какой-то причине он не хочет, чтобы выполнялись обработчики OnClose, OnDestroy и т. п., он может выбрать вызов  Halt. Если же ему надо, чтобы просто ничего не выполнялось после, он может вызвать ExitProcess. Но обычно выполнение этих команд связано с возникновением нечто действительно нестандартного...


 
ZeroDivide ©   (2009-06-18 15:51) [22]

На Terminate можно организовывать логику:

К примеру, такой код прямо в dpr

 Application.CreateForm(TCDM, CDM);
 Application.ProcessMessages;
 if not Application.Terminated then
 begin
   Application.CreateForm(TDDM, DDM);
   ...
 end;


Т.е. если приложение завершается, то и нефиг создавать другие формы и датамодули.


 
И. Павел   (2009-06-18 18:12) [23]

Спасибо всем. Выходит, Halt все же имеет недостатки. Буду пользоваться Application.Terminate.


 
TIniFile   (2009-06-18 19:29) [24]


> А если точнее, то после вызова Application.Terminate происходит
> завершение работы метода Application.Run, далее выполняется
> весь код, находящийся после Application.Run (если есть),
>  затем финализация всех модулей проекта, ну а в самом конце
> - завершение работы программы с нулевым кодом


А если ещё точнее, то финализация модулей происходит в _Halt0. А если совсем уж точно, то делает это FinalizeUnits, вызываемая как раз таки из _Halt0.


 
TIniFile   (2009-06-18 19:38) [25]


> по какой-то причине он не хочет, чтобы выполнялись обработчики
> OnClose, OnDestroy

OnDestroy сработает, если только форма не создавалась без владельца, ну дак тогда он и при Application.terminate не вызовется. А всякие OnClose, OnCloseQuery, эти да, будут пропущены.



Страницы: 1 вся ветка

Текущий архив: 2009.08.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.017 c
15-1245044573
blurcode
2009-06-15 09:42
2009.08.16
Срубил меня остеохондроз, видимо.


15-1245251682
Kerk
2009-06-17 19:14
2009.08.16
Посоветуйте аналоги Visio


4-1202326013
Velimir
2008-02-06 22:26
2009.08.16
Получить информацию о ресурсах PCI устройства


2-1245516025
Nikfel
2009-06-20 20:40
2009.08.16
Как сделать прозрачным главное меню пуск?


4-1214228936
KIRAT
2008-06-23 17:48
2009.08.16
Вторая копия программы