【问题标题】:If terminating a hung thread is a good idea, how do I do it safely?如果终止挂起的线程是个好主意,我该如何安全地做到这一点?
【发布时间】:2010-04-04 21:09:32
【问题描述】:

我的 Delphi 程序严重依赖 Outlook 自动化。由于插件和 Outlook 代码编写不当,2007-SP2 之前的 Outlook 版本往往会卡在内存中。

如果 Outlook 被卡住,调用 CreateOleObject('Outlook.Application') 或 GetActiveObject ... 不会返回并让我的应用程序一直挂起,直到 Outlook.exe 在任务管理器中关闭。

我已经想到了一个解决方案,但我不确定这是否是好的做法。

我会在一个单独的线程中使用 CreateOleObject 启动 Outlook,在我的主线程中等待 10 秒,如果 Outlook 挂起(CreateOleObject 没有返回),请让用户从我的程序中终止 Outlook.exe 进程。

但由于我不想强制用户终止 Outlook.exe 进程,作为替代方案,我还需要一种方法来终止程序中现在一直挂起的新线程。

  1. 这是一种好的做法吗?
  2. 如何在 Delphi 中终止挂起的线程而不泄漏内存?

【问题讨论】:

  • “写得不好”会被某些人视为煽动性的,或者被我们这些以前处理过这些问题的人视为多余的。兄弟,我分担你的痛苦……

标签: delphi multithreading outlook automation


【解决方案1】:

Windows 有一个TerminateThread 函数,但是从注释中可以看出,使用它通常不是一个好主意。更安全的方法是拥有一个与 Outlook 交互的辅助应用程序,然后您可以在不影响您自己的应用程序稳定性的情况下终止它。 TerminateProcess 会起作用,但如果您想对系统更友好一点,Dobbs 博士有一个article,使用 ExitProcess 可能更安全。

如果挂起是一致的并且总是发生或不发生,您可以在应用程序中调用 CreateOleObject 并退出,然后从您自己的再次调用它。如果不一致,辅助应用程序可能是一个更完整的包装器,并且所有交互都将通过它。

【讨论】:

  • 谢谢,我没有想到单独的应用程序,但这完全解决了我的问题。我正在使用 ShellExecuteEx 启动另一个应用程序(它对 CreateOleObject 进行了一次调用),如果生成的应用程序没有返回,我会根据用户请求终止 Outlook 或应用程序。
【解决方案2】:

另外,你可以使用线程的 Context 的 eip 寄存器。

您可以在以下位置找到样本;

http://www.tugrulhelvaci.com/?p=568

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多