我正在阅读这篇几乎解决了我的问题的帖子,因为没有人回答我的评论,所以我决定提出一个问题:
正如我在那里问的:
- 既然有可能多个线程共享同一个
OnTerminate
事件,它们也有可能同时完成吗? - 如果是这样,会发生什么?对方法的调用
OnTerminate
将被操作系统“排队”吗?换句话说,如果使用MainThread
属性,代码是否可以免于重入?
我正在阅读这篇几乎解决了我的问题的帖子,因为没有人回答我的评论,所以我决定提出一个问题:
正如我在那里问的:
OnTerminate
事件,它们也有可能同时完成吗?OnTerminate
将被操作系统“排队”吗?换句话说,如果使用MainThread
属性,代码是否可以免于重入?多个线程可能共享同一个 OnTerminate 事件
是的,正如另一个问题的答案向您展示的那样。
并同时完成?
线程可以同时完成它们的工作,但默认情况下OnTerminate
不会同时调用事件处理程序。这是因为OnTerminate
事件处理程序是通过TThread
对 的内部调用来TThread.Synchronize()
触发的,因此多个线程同时触发它们的OnTerminate
事件不会相互重叠。要更改该行为(大多数人不这样做),您必须重写虚拟TThread.DoTerminate()
方法以直接手动调用OnTerminate
事件处理程序而无需TThread.Synchronize()
先调用。
OnTerminate 是在 VCL 线程上触发的事件,因此它会是 PostMessaged,或者更可能是 SendMessaged。无论哪种方式, OnTerminate 都将被序列化。
也就是说,自 D3 以来我从未使用过这个事件(当我发现有多少 Delphi 线程支持实际上“有效”时)。
编辑 - 您可以通过在其中调用 Application.ProcessMessages 来重新输入 OnTerminate 调用,(如果您感觉特别有自杀倾向:)。