我正在阅读这篇文章几乎解决了我的问题,因为没有人回答我的评论我决定提问:
Original Post that almost answer my question
正如我在那里问的那样:
OnTerminate
事件,因此它们也可以同时完成吗?OnTerminate
方法的调用将由O.S“排队”?换句话说,如果使用MainThread
属性,代码是否可以不重入?答案 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调用(如果您感觉特别自杀:)。