你如何干净地中止一个 Delphi 程序?

Posted

技术标签:

【中文标题】你如何干净地中止一个 Delphi 程序?【英文标题】:How do you cleanly abort a Delphi program? 【发布时间】:2010-11-14 04:05:46 【问题描述】:

我有一个程序在关闭期间遇到了一些问题,引发了我无法追溯到其来源的异常。它似乎与时间相关且不确定。这是在所有共享资源被释放之后发生的,并且由于它已关闭,内存泄漏不是问题,所以这让我想知道是否有任何方法可以告诉程序在释放共享资源后立即静默终止,而不是继续关闭序列并给出异常消息框。

有人知道怎么做吗?

【问题讨论】:

是什么样的程序?控制台应用程序?基于应用程序?您正在尝试调试/进入/关闭过程? TApplication 基于,是的,我是,但它不工作。它似乎与时间有关,加上调试器在这个应用程序中或多或少没用。原因见qc.embarcadero.com/wc/qcmain.aspx?d=76039。 【参考方案1】:

查看 Delphi 运行时库源代码和 Microsoft 文档后;我可以证实 Mason 和 Paul-Jan cmets。

关机的层次如下

  Application.Terminate()
    performs some unidentified housekeeping of application
    calls Halt()

  Halt()
    calls ExitProc if set
    alerts the user in case of runtime error
    get rid of PackageLoad call contexts that might be pending
    finalize all units
    clear all exception handlers
    call ExitprocessProc if set
    and finally, call ExitProcess() from 'kernel32.dll'

  ExitProcess() 
    unloads all DLLs
    uses TerminateProcess() to kill the process

【讨论】:

TApplication.Terminate() 不调用Halt()。它调用终止过程列表(如果已设置),然后将WM_QUIT 消息发布到调用线程的消息队列。当TApplication.Run() 接收到WM_QUIT 时,它会中断消息循环并退出,返回项目的主代码块,然后退出,触发进程清理。【参考方案2】:

退出进程(0)?

【讨论】:

【参考方案3】:

Halt(0) 曾经是告诉程序立即结束的好方法。现在可能有一种对 Delphi 更友好的方法,但我 95% 确定 halt(0) 仍然有效。 :-)

【讨论】:

它确实有效,但它仍然会对所有完成部分和退出过程进行良好而干净的处理。如果其中一个触发了梅森的问题,他仍然有麻烦。【参考方案4】:

如果 HeartWare 建议使用 ExitProcess() 失败,可能是因为您使用了一些对 DLL_PROCESS_DETACH 响应不佳的 DLL。在这种情况下,请尝试使用 TerminateProcess(getCurrentProcess, 0);

一旦你采取这些措施,人们可能会怀疑主题标题的“干净”部分是否仍然经得起审查。

【讨论】:

哦,他可以洗完手——保持干净!【参考方案5】:

最后一次我不得不寻找这样的问题是关闭导致事件(调整大小?已经有一段时间了。)在垂死的窗口上触发,导致尝试重绘需要已经存在的东西的东西处理掉。

【讨论】:

以上是关于你如何干净地中止一个 Delphi 程序?的主要内容,如果未能解决你的问题,请参考以下文章

c#多线程

C#程序退出的几种方法

如何使用 Ctrl+C 输入干净地退出 QProcess?

一段时间后中止程序

如何在Delphi 10.1 Berlin中安全地访问“共享文件夹”?

请问Delphi 7.0开发的程序如何打包?