繁体   English   中英

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

[英]If terminating a hung thread is a good idea, how do I do it safely?

我的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中的挂起线程?

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

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

此外,您还可以使用线程的Context的eip寄存器。

你可以找到一个样本;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM