Как правильно завершить работу приложения 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 API PostQuitMessage Функция для выполнения упорядоченного завершения работы приложения. Terminateне сразу. Terminate вызывается автоматически в сообщении WM_QUIT и при закрытии основной формы.

Halt()с другой стороны, это немедленное ненормальное завершение. В основном, вырывая процесс из памяти. Используйте его только в экстремальных ситуациях, когда другие варианты недоступны.

System.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);
Другие вопросы по тегам