【发布时间】:2015-10-18 01:19:12
【问题描述】:
我有一个中等复杂的程序,它使用了几个第三方组件,我在 Borland/Codegear/Embarcadero IDE 的多次迭代中维护了超过 20 年。最新的迭代(使用 Delphi 2010)有一个问题,该问题仅出现在某些用户的机器上,它在关闭时停止响应。如果用户右键单击任务栏图标并再次选择“关闭”,程序将关闭。
我试图在我的位置重现该问题,但没有成功。我已经实现了各种日志记录方案,并且可以看到执行在 FormCloseQuery 过程之后但在 FormDestroy 事件之前停止。
当用户启动关闭时,会执行多个表单和多个线程。
- 我已检查我的线程是否正确终止。 (我在 OnCloseQuery 事件处理程序中关闭它们)
- 只有主窗体有 OnCloseQuery 事件处理程序,我知道它以 CanClose = true 退出。
- 我记录了打开表单的最终确定代码,但在用户右键单击任务栏图标并再次选择关闭之前,它们都不会执行。
- 我检查了 SysUtils.DoneMonitorSupport 例程,直到用户再次选择关闭后它才会运行。
我创建了一个小调试程序,它注册一条 Windows 消息并显示来自相关应用程序的信息。这是我看到的:
Debug Message ID = 49681
7/28/2015 2:34:26 PM - MyApp initialized
7/28/2015 2:34:42 PM - Port opened COM3
7/28/2015 2:34:44 PM - Port opened COM5
7/28/2015 3:14:51 PM - Port closed COM3
7/28/2015 3:14:51 PM - Port closed COM5
7/28/2015 3:14:51 PM - MyApp closing (last line in MainForm.OnCloseQuery)
7/28/2015 3:14:51 PM - Configuration window destroy **stalls here**
7/28/2015 3:15:25 PM - Run Table destroy
7/28/2015 3:15:25 PM - Alert window destroy
7/28/2015 3:15:25 PM - Sample Table destroy
7/28/2015 3:15:25 PM - Debug window destroy
7/28/2015 3:15:25 PM - Main window destroy
7/28/2015 3:15:26 PM - Main window finalize
配置窗口创建并拥有多个子窗体。在配置窗口的 OnDestroy 代码中,这些代码被释放,但会调用 Application.ProcessMessages。 (早在 2000 年代初期就有一个问题,有时表单在被释放时会发送消息)这可能是问题吗?
【问题讨论】:
-
在项目中添加madExcept并使用madTraceProcess提取事后调试信息。
-
恕我直言,最可能的罪魁祸首是第三方组件之一在其销毁过程中未正确关闭。
-
我会再次测试线程,这次甚至不要启动它们并尝试关闭您的应用程序。
-
我怀疑在 VCL 部分关闭(但还没有完全关闭)时抛出了一些异常并尝试显示
-
谢谢大卫,我已经听从了你的建议,我已经发布了一个关于结果的新问题here。
标签: delphi delphi-2010