首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果终止挂起的线程是一个好主意,我如何安全地完成它?

如果终止挂起的线程是一个好主意,我如何安全地完成它?
EN

Stack Overflow用户
提问于 2010-04-04 21:09:32
回答 2查看 1.4K关注 0票数 10

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-04 23:11:53

Windows有一个TerminateThread函数,但正如您从备注中看到的那样,使用它通常不是一个好主意。一种更安全的方法是拥有一个与Outlook交互的辅助应用程序,然后您可以在不影响您自己的应用程序稳定性的情况下杀死它。TerminateProcess可以工作,但是如果您想对系统更加友好,Dobbs博士有一个可能更安全的使用ExitProcess的方法的文章

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

票数 10
EN

Stack Overflow用户

发布于 2010-04-12 13:57:10

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

你可以在那里找到一个样本;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2575897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档