在Delphi中终止一个线程

7

如何正确终止一个线程? 当线程结束时,它仍然存在于内存中。我正在使用Delphi 2010(更新5)。


使用FreeOnTerminate属性。当线程终止时,它会被释放 :-) - Brian Frost
3个回答

12
通常我描述线程终止问题的方式是强调协作。您不应该终止线程。相反,您应该通知线程您想要终止它。然后您礼貌地等待它终止。
原因显而易见。只有线程知道如何终止自己。只有线程知道它持有哪些锁,需要释放哪些资源等。
如果您希望暂停或挂起线程的执行,同样的论点适用。您应该要求它这样做,然后让线程在安全时刻找到方便的时机。
使用 Delphi 的 TThread 请求终止的标准方法是调用 Thread.Terminate。这只是在线程对象中设置一个标志。这就是请求。响应由 TThread.Execute 中的线程代码启动。它应该定期检查其 Terminated 属性的值。当发现为真时,应在调用 exit 之前执行任何整理工作(释放锁,返回资源等)。

谢谢David, 但这是一个bug吗? 在其他编程语言中,是否也使用类似的方法来停止程序? - Mohamad
1
@Mohammad 不,这不是一个 bug,我也不知道其他系统是否会经常以抢占的方式终止线程。 - David Heffernan
4
没错,通常情况下你不会“杀死”线程,而是发送信号给它们。线程会自行关闭。 - Warren P

3

如何精确地终止一个线程?如果你只是设置Terminate标志,这只是在线程内部检查的一个标志。如果你需要终止执行线程(而不是发出信号告诉TThread对象需要完成),你可以使用TerminateThread WinAPI函数。但你应该注意到,这会导致资源泄漏(正如在TerminateThread文档中的注释中所写的那样)。


4
资源泄漏不是避免调用TerminateThread的真正原因。真正的原因在于,当您终止持有锁的线程时,很可能会导致您的应用程序死锁。 - David Heffernan
1
Terminate方法本身并不会终止线程,它只是将Terminated属性设置为true。您必须在Execute方法中检查它(有时不仅仅是一个地方),并尽快退出Execute方法(通常在清理完所需的所有内容后)。当Execute方法退出时,线程终止。然后操作系统线程被终止,但TThread实例仍然存在。您必须释放该实例或使用FreeOnTerminate属性(但要注意其含义)。 - user160694
TerminateThread() "杀死"线程及其相关内容。这意味着内存可能无法释放,句柄丢失,锁未释放,以及其他在MSDN中解释的问题。所有这些问题都是开发人员想要避免的。它并不是设计成用于常规终止线程的函数,而是设计用于异常情况下的使用。 - user160694
3
@Mohammed 不要使用TerminateThread。不要使用TerminateThread。不要使用TerminateThread。不要使用TerminateThread。不要使用TerminateThread。不要使用TerminateThread。不要使用TerminateThread。 - David Heffernan
@Mohammad 我在这个评论中给出了一个详细的答案,因为有太多细节无法用简单的评论来解释。 - David Heffernan
显示剩余4条评论

3

1
您现在可以使用此链接:http://www.nickhodges.com/MultiThreadingInDelphi/ToC.html - EMBarbosa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接