如果终止挂起的线程是个好主意,我该如何安全地进行?

时间:2010-04-04 21:09:32

标签: delphi multithreading outlook automation

我的Delphi程序在很大程度上依赖于Outlook自动化。 2007-SP2之前的Outlook版本由于编写错误的插件和编写错误的Outlook代码而倾向于卡在内存中。

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

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

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

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

  1. 这是一个好习惯吗?
  2. 如何在不泄漏内存的情况下终止Delphi中的挂起线程?

2 个答案:

答案 0 :(得分:10)

Windows具有TerminateThread功能,但从备注中可以看出,使用它通常不是一个好主意。更安全的方法是拥有一个与Outlook交互的辅助应用程序,然后您可以杀死它而不影响您自己的应用程序的稳定性。 TerminateProcess可以工作,但是如果你想对系统更友好一点,Dobbs博士使用ExitProcess有一个article可能更安全的方法。

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

答案 1 :(得分:0)

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

您可以在

找到样本

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