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

sg24os4d  于 2023-03-02  发布在  其他
关注(0)|答案(5)|浏览(758)

我想终止一个 Delphi 应用程序而不执行任何其他代码行,我想知道哪种方法是正确的。此外,我想知道我现在实际做的事情是否有什么错误。基本上,我的代码看起来像这样:

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

这是停止 Delphi 应用程序的正确方法还是应该用另一种方法来完成?

wfypjpf4

wfypjpf41#

Application.Terminate()中断TApplication.Run()TForm.ShowModal()中的消息循环,允许主线程正常退出,执行必要的清理等。
Vcl.Forms.TApplication.Terminate
结束应用程序执行。
调用Terminate以编程方式结束应用程序。通过调用Terminate而不是释放应用程序对象,您允许应用程序以有序的方式关闭
Terminate调用Windows API PostQuitMessage函数以执行应用程序的有序关闭。Terminate不会立即执行。Terminate在WM_QUIT消息和主窗体关闭时自动调用。
另一方面,Halt()是一个立即异常终止。基本上,从内存中剥离进程。只有在没有其他选项可用的极端情况下才使用它。
System.Halt
启动程序的异常终止
暂停执行程序的异常终止并返回操作系统。
要执行 Delphi 应用程序的正常终止,请调用全局Application对象上的Terminate方法。如果应用程序不使用提供Application对象的单元,请从主Program块调用Exit过程。

qlvxas9a

qlvxas9a2#

我想终止一个 Delphi 应用程序而不执行任何其他代码。
Application.TerminateHalt都不能做到,前者是有序终止,会执行很多代码,调用Halt更有希望,那是非正常终止,但是单元终结代码执行了。
如果你想尽快退出,执行最少的代码,调用ExitProcess,这是Halt的最后一步,直接调用ExitProcess可以避免Halt调用ExitProcess之前的所有步骤。

mqkwyuun

mqkwyuun3#

我在使用Application.Terminate时遇到一些问题,因为我必须启动“表单关闭”过程,所以我只执行了以下操作:

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.
92vpleto

92vpleto4#

如果代码必须在主窗体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。
注意:为什么这样的代码在主窗体上创建?简单的答案可能是,exe检查要运行的条件,并看到他们不满足(丢失文件等),粗鲁的一个(对不起),只是因为我想/需要。

ehxuflar

ehxuflar5#

我知道这是一个老线程,但会感谢对这个线程添加评论,如果有人还在听。
很长一段时间以来,我调用了Application.Terminate,然后调用了ExitProcess(0)。我的理论是,Application.Terminate执行了优雅的清理,但ExitProcess阻止了任何其他代码的执行。它似乎可以工作,而且我没有收到内存泄漏或其他不良影响的报告。代码如下所示:

Procedure (KillTheApp);
begin
    Application.Terminate;
    Application.ProcessMessages;
    ExitProcess(0);
end;

相关问题