2016-07-14 167 views
0

我需要创建一个线程,试图在特定的时间内执行一个函数。如果线程没有成功,我需要用一个表示错误的数字来完成他。如何设置超时到MFC线程

我想这样做是因为我必须执行的程序的外部库,但有时会进入无限循环以搜索尚未就绪的资源,并且程序暂停等待该功能。

+0

您是否开始开发过程?请分享你的代码 – ddb

+0

请记住,如果你终止一个线程,它所持有的锁和外部资源将不会被释放。 –

+2

而且,虽然正确,@ RichardCritten的评论听起来并不像应该那么危险。锁发挥中心作用的常见情况是序列化堆访问。如果您[TerminateThread](https://msdn.microsoft.com/en-us/library/windows/desktop/ms686717.aspx)线程正处于分配内存的中间位置,则任何后续尝试分配内存相同的堆将等待锁定,永远不会被释放。所以你和死锁交换了无限循环。这是朝某个方向迈出的一步,而不是前进。 – IInspectable

回答

1

您不能通过将错误实现卸载到同一进程中的另一个线程来解决这个问题,因为如果它发生冲突,没有办法安全地关闭该线程。调用TerminateThread是从外部取下线程的唯一方法。由于其后果,当一个过程必须继续可靠地运行时,它不能被使用。

例如,TerminateThread可能会导致以下问题:

  • 如果目标线程拥有临界区,临界区将不会被释放。
  • 如果目标线程正在从堆中分配内存,堆锁将不会被释放。
  • 如果目标线程在终止时正在执行某些kernel32调用,则线程进程的kernel32状态可能不一致。
  • 如果目标线程正在操作共享DLL的全局状态,则DLL的状态可能会被破坏,从而影响DLL的其他用户。

你唯一的选择是:

  1. 请求来自第三方库的供应商一个修正错误。
  2. 将第三方库卸载到自己的进程中。在这个代理过程中,您可以在自己的线程上运行第三方库,如果它没有及时返回(使用WaitForSingleObject和超时值来确定该条件),请致电ExitProcess以结束痛苦。您必须在您的流程之间实施interprocess communications才能运行。