Как правильно завершить работу приложения Delphi?
Я хотел бы завершить приложение Delphi без выполнения какой-либо другой строки кода, и мне интересно, какой из способов является правильным. Кроме того, я хотел бы знать, если что-то не так в том, что я сейчас делаю. В основном мой код выглядит так:
//Freeing all objects (Obj1.Free, etc..)
Application.Terminate;
Halt;
Это правильный способ остановить приложение Delphi или это должно быть сделано по-другому?
6 ответов
Application.Terminate()
прерывает зацикливание сообщения TApplication.Run()
а также TForm.ShowModal()
, позволяя основному потоку нормально выйти, выполнить необходимые очистки и т. д.
Vcl.Forms.TApplication.Terminate
Завершает выполнение приложения.
Вызов
Terminate
завершить приложение программно. По телефонуTerminate
вместо того, чтобы освобождать объект приложения, вы позволяете приложению корректно завершать работу.
Terminate
вызывает Windows APIPostQuitMessage
Функция для выполнения упорядоченного завершения работы приложения.Terminate
не сразу.Terminate
вызывается автоматически в сообщении WM_QUIT и при закрытии основной формы.
Halt()
с другой стороны, это немедленное ненормальное завершение. В основном, вырывая процесс из памяти. Используйте его только в экстремальных ситуациях, когда другие варианты недоступны.
Инициирует аварийное завершение программы.
Halt выполняет ненормальное завершение программы и возвращается в операционную систему.
Чтобы выполнить обычное завершение приложения Delphi, вызовите
Terminate
метод на глобальномApplication
объект. Если приложение не использует блок, который обеспечиваетApplication
объект, вызовитеExit
процедура из основного блока программы.
Я хотел бы завершить приложение Delphi без выполнения какого-либо другого кода.
ни Application.Terminate
ни Halt
достигнет этого. Первый выполняет упорядоченное завершение. Много кода будет выполняться. призвание Halt
больше надежды Это ненормальное завершение. Но код завершения модуля выполнен.
Если вы хотите выйти как можно быстрее, выполнив минимальное количество кода по пути, позвоните ExitProcess
, Это последний шаг Halt
и позвонив ExitProcess
непосредственно вы избегаете всех шагов, которые Halt
занимает до того, как он звонит ExitProcess
,
У меня были проблемы с Application.Terminate, потому что мне нужно было запустить процедуру закрытия формы, поэтому я сделал только:
Form1.Close;
Просто чтобы оставить точку на дополнительной проблеме, если код должен быть в главной форме OnCreate.
Попробуйте такой код в событии Main Form OnCreate. Он не работает должным образом, отображается основная форма, затем приложение завершается.
Чтобы увидеть его, добавьте еще одну форму и создайте длинный цикл создания.
Кажется, что все Application.CreateForm
На основном проекте исходники выполнены.
Образец кода:
procedure TMyMainForm.FormCreate(Sender: TObject);
begin
ShowMessage('[1] This must allways be shown');
if mrOK=MessageDlg('Exit?',mtConfirmation,[mbOK,mbCancel],0)
then begin
Application.Terminate;
Exit;
end;
ShowMessage('[2] This must not allways be shown');
end;
procedure TMyOtherForm.FormCreate(Sender: TObject);
begin
ShowMessage('[3] This must not allways be shown');
end;
С этим кодом сообщения [1] и [3] всегда отображаются.
Единственный способ не показать [3] - это вызвать Стоп.
Примечание: почему такой код на MainForm OnCreate? Простой ответ может быть, exe проверяет условия для запуска и видит, что они не соответствуют (отсутствующие файлы и т. Д.), Грубый (извините за это), просто потому, что я хочу / нужно.
Я знаю, что это старая ветка, но буду признателен за комментарии к этому дополнению к ветке, если кто-то все еще слушает.
В течение некоторого времени я вызывал Application.Terminate, а затем ExitProcess(0). Моя теория заключается в том, что Application.Terminate выполняет изящную очистку, но ExitProcess предотвращает выполнение любого другого кода. Кажется, это работает, и я не получаю сообщений об утечках памяти или других побочных эффектах. Код будет примерно таким:
Procedure (KillTheApp);
begin
Application.Terminate;
Application.ProcessMessages;
ExitProcess(0);
end;
на dll
TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS,False,GetPIDbyProcessName(ExtractFileName(ParamStr(0)))),0);