我的应用程序使用两个自编写的组件,在"加载"过程
首先创建的组件是单实例控件,应该在找到另一个实例时退出应用程序。
第二个创建的组件是我的数据库访问,它在" loaded"中建立了数据库连接。过程
如果找到第一个实例,我会尝试在其他任何事情发生之前结束应用程序。
试用1: 在我的实例控件中,我调用" Application.Terminate"停止我的申请。这不起作用 - 我的数据库连接仍然建立。似乎" Application.Terminate"使用" PostMessage"呼唤自己,在收到消息之前不会被读取(这将在所有组件加载后发生......)。很明显,这个解决方案对我不起作用。
试用2: 在我的实例控件中,我打电话给#34;暂停"停止我的申请。这会立即停止我的应用程序,但似乎会造成大量内存泄漏 - 至少这是delphi" ReportMemoryLeaksOnShutdown"告诉我。之后,我觉得这很烦人"这个应用程序已停止工作" Windows对话。这个解决方案对我不起作用。
问题A: 是否有其他方式来结束应用程序? 问题B: 当使用" Halt"时,Delphi的内存泄漏报告是否正常工作?使用" Halt"?
退出应用程序后是否真的存在内存泄漏答案 0 :(得分:1)
如果Application.Terminate
终止太晚,并且您希望终止后加速,那么Halt
似乎是适当的行动方案。我并不特别明白为什么Halt
应该导致此应用程序已停止工作例外。这表明您的程序的单元定型代码正在引发未处理的异常。您也许可以尝试解决(比如使用调试器)为什么会引发这些异常并防止它出现。或者你可以通过调用更残酷的ExitProcess
来避免单位定稿。
调用Halt
时确实会发生内存泄漏。但是,可以安全地忽略这些,因为操作系统在进程终止时回收所有已分配的内存。换句话说,内存在应用程序未释放的意义上泄露,但操作系统无论如何都会立即释放它。
然而,对于你来说,残酷的Halt
是否是正确的行动方案,我不能说。那是你决定的。 FWIW,在组件的Halt
方法中调用Loaded
对我来说听起来非常可疑。
如果您只想确保只运行一个程序实例,那么您可以对.dpr文件进行简单修改即可实现。 Stack Overflow上已经反复讨论过这个主题。您可以在Rob Kennedy的答案中找到良好的报道和建议:How can I tell if another instance of my program is already running?