终止 Delphi 应用程序的正确方法是什么?

问题描述 投票:0回答:5

我想在不执行任何其他代码行的情况下终止 Delphi 应用程序,我想知道哪种方法是正确的。此外,我想知道我目前正在做的事情是否有问题。 基本上,我的代码是这样的:

//Freeing all objects (Obj1.Free, etc..)
Application.Terminate;
Halt;

这是停止 Delphi 应用程序的正确方法还是应该以其他方式完成?

delphi terminate halt
5个回答
39
投票

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
过程。


12
投票

我想在不执行任何其他代码的情况下终止 Delphi 应用程序。

Application.Terminate
Halt
都不会实现这一点。前者执行有序终止。将执行大量代码。呼唤
Halt
更有希望。那就是异常终止。但是执行单元完成代码。

如果你想尽快退出,一路上执行最少的代码,调用

ExitProcess
。这是
Halt
的最后一步,通过直接调用
ExitProcess
,您可以避免
Halt
在调用
ExitProcess
之前采取的所有步骤。


2
投票

我在使用 Application.Terminate 时遇到了一些问题,因为我必须启动 Form Close 程序,所以我只做了:

Form1.Close;

我在 .dproj 中找到了一个新的解决方案

begin
  ReportMemoryLeaksOnShutdown := True;
  Application.Initialize;
  Application.CreateForm(TFormMain, FormMain);
  if Not(VerifyCode()) then
  begin
      ShowMessage('Software unregistered!');
      Application.Terminate;
  end
  else
  Application.Run;
end.

1
投票

如果代码必须在主窗体 OnCreate 上,只是在一个额外的问题上留下一点。

在主窗体 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] 的唯一方法是调用 Halt。

注意:为什么在 MainForm OnCreate 上有这样的代码?简单的答案可能是,exe 检查要运行的条件并查看它们不满足(丢失文件等),粗鲁的一个(对此感到抱歉),只是因为我想要/需要。


0
投票

我知道这是一个旧话题,但如果有人还在听,我将不胜感激对这个话题的评论。

很长一段时间我都调用了 Application.Terminate,然后调用了 ExitProcess(0)。我的理论是 Application.Terminate 进行了优雅的清理,但 ExitProcess 阻止了任何其他代码的执行。它似乎有效,而且我没有收到有关内存泄漏或其他不良影响的报告。代码会是这样的:

Procedure (KillTheApp);
begin
    Application.Terminate;
    Application.ProcessMessages;
    ExitProcess(0);
end;
© www.soinside.com 2019 - 2024. All rights reserved.