【问题标题】:terminate a thread in delphi在delphi中终止一个线程
【发布时间】:2011-07-14 20:39:31
【问题描述】:

如何以正确的方式终止线程? 当线程完成时,它仍在内存中。我正在使用 Delphi 2010(更新 5)。

【问题讨论】:

  • 使用 FreeOnTerminate 属性。当线程终止时 - 它是 Free'd :-)

标签: multithreading delphi terminate


【解决方案1】:

我通常描述线程终止问题的方式是强调合作。您不应该终止线程。相反,您应该通知线程您希望它终止。然后你礼貌地等到它终止。

原因很明显。只有线程知道如何终止自己。只有线程知道它持有什么锁,需要释放什么资源等等。

如果您希望暂停或暂停线程的执行,则适用相同的参数。你应该要求它这样做,然后让线程在安全的时候找到一个方便的时刻。

使用 Delphi TThread 请求终止的标准方法是调用 Thread.Terminate。这只不过是在线程对象中设置一个标志。这就是请求。响应由TThread.Execute 中的线程代码发起。这应该定期检查其Terminated 属性的值。当发现为真时,它应该从函数中退出。自然,任何整理(释放锁、返回资源等)都应该在调用 exit 之前进行。

【讨论】:

  • 谢谢大卫,但这是一个错误吗?和在其他编程语言中停止程序类似的方法是使用的吗?
  • @Mohammad 不,这不是一个错误,而且我所知道的其他系统都不会经常以先发制人的方式杀死线程。
  • 没错。您通常不会杀死线程,而是向它们发出信号。他们关闭了自己。
【解决方案2】:

你究竟是如何终止一个线程的?如果您只是设置了 Terminate,这只是在线程内部检查的一个标志。如果您需要终止执行线程(并且不向 TThread 对象发出它需要完成的信号),您可以使用TerminateThread WinAPI 函数。但是您应该注意到这会导致资源泄漏(如 TerminateThread 文档中的 cmets 中所写)。

【讨论】:

  • 资源泄漏并不是避免调用 TerminateThread 的真正原因。真正的原因是,当你终止一个持有锁的线程时,它可能会死锁你的应用程序。
  • 当我使用 myThread.Terminate 时,它​​仍在内存中并正在运行。
  • Terminate *不自行终止线程 - 它只是将 Terminated 属性设置为 true。您必须在您的 Execute 方法中检查它(有时不仅仅在一个地方),并尽快退出 Execute 方法(通常在您清理完所有需要的东西之后)。当 Execute 方法退出时,线程终止。然后 OS 线程终止,但 TThread 实例仍然存在。您必须释放实例,或使用 FreeOnTerminate 属性(但要注意它的含义)。
  • TerminateThread() 用它所暗示的一切“杀死”线程。这意味着无法释放内存、丢失句柄、未释放锁以及 MSDN 中解释的其他问题。开发人员希望避免的所有问题。它并非设计为用作终止线程的常用函数,而是设计用于在特殊情况下使用。
  • @Mohammed 不要使用 TerminateThread。不要使用 TerminateThread。不要使用 TerminateThread。不要使用 TerminateThread。不要使用 TerminateThread。不要使用 TerminateThread。不要使用 TerminateThread。
【解决方案3】:

这取决于你想用那个线程完成什么。在我们为您提供帮助之前,您应该提供有关您想要做什么的更多详细信息。

这里有一个关于如何在 Delphi 中使用线程的非常好的教程:

http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/Ch1.html

http://docwiki.embarcadero.com/RADStudio/en/Writing_multi-threaded_applications_Index

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多