哪种终止delphi应用程序的正确方法?

时间:2015-05-23 17:06:37

标签: delphi terminate halt

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

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

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

4 个答案:

答案 0 :(得分:29)

drawRect打破了Application.Terminate()TApplication.Run()中的消息循环,允许主线程正常退出,执行必要的清理等等。

Vcl.Forms.TApplication.Terminate

  

结束应用程序执行。

     

调用TForm.ShowModal()以编程方式结束应用程序。通过调用Terminate而不是释放应用程序对象,您允许应用程序以有序方式关闭

     

Terminate调用Windows API Terminate函数来执行应用程序的有序关闭。 PostQuitMessage不是即时的。   在WM_QUIT消息上以及主窗体关闭时会自动调用Terminate

另一方面,

Terminate是立即异常终止。基本上,将进程从内存中删除。仅在没有其他选项的极端情况下使用它。

System.Halt

  

启动程序的异常终止

     

Halt执行异常终止程序并返回操作系统。

     

要执行Delphi应用程序的正常终止,请在全局Halt()对象上调用Terminate方法。如果应用程序不使用提供Application对象的单元,请从主程序块中调用Application过程。

答案 1 :(得分:7)

  

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

Application.TerminateHalt都不会实现这一目标。前者执行有序终止。很多代码都会执行。呼叫Halt更有希望。这是异常终止。但是执行单元定型代码。

如果您希望尽快退出,请沿途执行最少量的代码,请致电ExitProcess。这是Halt的最后一步,通过直接致电ExitProcess,您可以避免Halt在调用ExitProcess之前采取的所有步骤。

答案 2 :(得分:1)

如果代码必须在主窗体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]的唯一方法是调用Halt。

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

答案 3 :(得分:0)

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

Form1.Close;