为什么我的程序在OnCloseQuery和FormDestroy事件之间挂起?

时间:2015-07-27 18:04:12

标签: delphi delphi-2010

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

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

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

  1. 我检查过我的线程是否正常终止。 (我在OnCloseQuery事件处理程序中关闭它们)
  2. 只有主窗体有一个OnCloseQuery事件处理程序,我知道它以CanClose = true退出。
  3. 我记录了打开表单的最终化代码,在用户右键单击任务栏图标并再次选择关闭之前,它们都不会执行。
  4. 我检查了SysUtils.DoneMonitorSupport例程,直到用户再次选择关闭后才会运行。
  5. 我创建了一个小程序,用于注册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年初,有一个问题,有时表格会在被释放时发送一条消息)这可能是问题吗?

1 个答案:

答案 0 :(得分:0)

There was a call to Application.ProcessMessages in the FormDestroy event handler of my configuration window. After I took that out the customer has not seen the problem.