Форум: "Прочее";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];
ВнизЗавершение программы через 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 можно организовывать логику:
К примеру, такой код прямо в dprApplication.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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.006 c