使用常见的OnTerminate行为进行TThread

时间:2013-07-25 19:06:31

标签: windows multithreading delphi delphi-6

我正在阅读这篇文章几乎解决了我的问题,因为没有人回答我的评论我决定提问:

Original Post that almost answer my question

正如我在那里问的那样:

  • 由于多个线程可能共享相同的OnTerminate事件,因此它们也可以同时完成吗?
  • 如果是这样,会发生什么?对OnTerminate方法的调用将由O.S“排队”?换句话说,如果使用MainThread属性,代码是否可以不重入?

2 个答案:

答案 0 :(得分:5)

  

多个线程可能共享相同的OnTerminate事件

是的,正如the other question给出的答案一样。

  

并在同一时间结束?

线程可以同时完成它们的工作,但是默认情况下不会同时调用OnTerminate事件处理程序。这是因为OnTerminate事件处理程序由TThread使用对TThread.Synchronize()的内部调用触发,因此同时触发其OnTerminate事件的多个线程不会相互重叠。要更改该行为(大多数人不这样做),您必须覆盖虚拟TThread.DoTerminate()方法,以便直接手动调用OnTerminate事件处理程序,而无需先调用TThread.Synchronize()

答案 1 :(得分:3)

OnTerminate是在VCL线程上触发的事件,因此它将是PostMessaged,或者更可能是SendMessaged。无论哪种方式,OnTerminates都将被序列化。

那就是说,自D3以来我从未使用过这个事件(当我发现有多少Delphi线程支持实际上'工作'时)。

编辑 - 您可以通过调用其中的Application.ProcessMessages来重新输入OnTerminate调用(如果您感觉特别自杀:)。