【发布时间】:2011-07-14 20:39:31
【问题描述】:
如何以正确的方式终止线程? 当线程完成时,它仍在内存中。我正在使用 Delphi 2010(更新 5)。
【问题讨论】:
-
使用 FreeOnTerminate 属性。当线程终止时 - 它是 Free'd :-)
标签: multithreading delphi terminate
如何以正确的方式终止线程? 当线程完成时,它仍在内存中。我正在使用 Delphi 2010(更新 5)。
【问题讨论】:
标签: multithreading delphi terminate
我通常描述线程终止问题的方式是强调合作。您不应该终止线程。相反,您应该通知线程您希望它终止。然后你礼貌地等到它终止。
原因很明显。只有线程知道如何终止自己。只有线程知道它持有什么锁,需要释放什么资源等等。
如果您希望暂停或暂停线程的执行,则适用相同的参数。你应该要求它这样做,然后让线程在安全的时候找到一个方便的时刻。
使用 Delphi TThread 请求终止的标准方法是调用 Thread.Terminate。这只不过是在线程对象中设置一个标志。这就是请求。响应由TThread.Execute 中的线程代码发起。这应该定期检查其Terminated 属性的值。当发现为真时,它应该从函数中退出。自然,任何整理(释放锁、返回资源等)都应该在调用 exit 之前进行。
【讨论】:
你究竟是如何终止一个线程的?如果您只是设置了 Terminate,这只是在线程内部检查的一个标志。如果您需要终止执行线程(并且不向 TThread 对象发出它需要完成的信号),您可以使用TerminateThread WinAPI 函数。但是您应该注意到这会导致资源泄漏(如 TerminateThread 文档中的 cmets 中所写)。
【讨论】:
这取决于你想用那个线程完成什么。在我们为您提供帮助之前,您应该提供有关您想要做什么的更多详细信息。
这里有一个关于如何在 Delphi 中使用线程的非常好的教程:
http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/Ch1.html
http://docwiki.embarcadero.com/RADStudio/en/Writing_multi-threaded_applications_Index
【讨论】: