Delphi - 终止被阻塞的线程

时间:2010-01-13 11:34:26

标签: delphi multithreading blocked-threads

  

可能重复:
  How to stop long executing threads gracefully?

您好。

我有一个需要执行操作的后台线程,除了一种情况外,它在所有时间都能正常工作:资源损坏时。当发生这种情况时,线程在Execute方法的Load(到该资源)调用中被阻塞。

当发生这种情况时,线程将不响应Terminate方法(从主线程调用)并被阻止。

所以,我的问题是:如何正确终止被阻塞的线程(来自主线程)。并且我不能修改加载资源的类,或者既不知道资源是否已损坏。

1 个答案:

答案 0 :(得分:1)

查找TerminateThread() WinAPI函数。 可以找到一些有用的解释here或查看MSDN文档。

当然,在终止之后,你必须查看线程中分配的任何资源是否未被释放并正确释放它。


更新

是的,使用TerminateThread是不好的做法(在评论中指定)。我同意这个意见。但是“永远不要使用它,即使你真的需要使用它”,从我的角度来看它太强大并且非常理论上的推荐。现实世界充满了设计缺陷和有缺陷的第三方图书馆 提供的信息不足以对这一具体情况做出正确的决定。例如。它可能是临时的解决方法,没有替代品等。
因此,从理论的角度来看,正确答案是:“如果无法控制如何在后台线程中处理”冻结“步骤,则无法正常终止处理。”
从实际的角度来看,正确答案是:“如果无法控制如何在后台线程中处理”冻结“步骤,则无法正常终止进程。但如果你意识到你不能,但仍然需要这样的功能 - 使用TerminateThread()API调用“

关于TerminateThread与TerminateProcess:
   - 创建/终止过程比创建/终止线程需要更多资源    - 创建/终止过程更复杂=>更多地方的虫子
   - TerminateProcess不会立即终止并等待I / O操作完成(MSDN)=>在阅读和其他类似的I / O场景中,远程共享文件夹不可用的场景不是一种选择    - 创建和终止流程需要比创建线程更多的用户权限,比较MSDN herehere

关于资源释放:
  终止线程时线程堆栈自动释放(在MSDN中为mentonied)。资源主要是资源,由主线程分配,用于与后台线程进行通信。例如。记忆结构,互斥体等。