【问题标题】:Why does my program hang between OnCloseQuery and FormDestroy events?为什么我的程序在 OnCloseQuery 和 FormDestroy 事件之间挂起?
【发布时间】:2015-10-18 01:19:12
【问题描述】:

我有一个中等复杂的程序,它使用了几个第三方组件,我在 Borland/Codegear/Embarcadero IDE 的多次迭代中维护了超过 20 年。最新的迭代(使用 Delphi 2010)有一个问题,该问题仅出现在某些用户的机器上,它在关闭时停止响应。如果用户右键单击任务栏图标并再次选择“关闭”,程序将关闭。

我试图在我的位置重现该问题,但没有成功。我已经实现了各种日志记录方案,并且可以看到执行在 FormCloseQuery 过程之后但在 FormDestroy 事件之前停止。

当用户启动关闭时,会执行多个表单和多个线程。

  1. 我已检查我的线程是否正确终止。 (我在 OnCloseQuery 事件处理程序中关闭它们)
  2. 只有主窗体有 OnCloseQuery 事件处理程序,我知道它以 CanClose = true 退出。
  3. 我记录了打开表单的最终确定代码,但在用户右键单击任务栏图标并再次选择关闭之前,它们都不会执行。
  4. 我检查了 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


【解决方案1】:

在我的配置窗口的 F​​ormDestroy 事件处理程序中调用了 Application.ProcessMessages。在我把它拿出来之后,客户没有发现问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多