Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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 можно организовывать логику:

К примеру, такой код прямо в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.006 c
6-1204874743
Михаил (Питер)
2008-03-07 10:25
2009.08.16
Широковещательный UDP запрос


2-1245284214
<AIRDIGER>
2009-06-18 04:16
2009.08.16
web сторку к норамальному пути


15-1245123478
DelphiN!
2009-06-16 07:37
2009.08.16
Установка новых устройств под учеткой с правами пользователя


2-1245134982
vitalik200888
2009-06-16 10:49
2009.08.16
как поменять главную форму в delphi.


15-1244723703
dmk
2009-06-11 16:35
2009.08.16
Сомнения по работе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский