1

我正在阅读这篇几乎解决了我的问题的帖子,因为没有人回答我的评论,所以我决定提出一个问题:

几乎回答了我的问题的原始帖子

正如我在那里问的:

  • 既然有可能多个线程共享同一个OnTerminate事件,它们也有可能同时完成吗?
  • 如果是这样,会发生什么?对方法的调用OnTerminate将被操作系统“排队”吗?换句话说,如果使用MainThread属性,代码是否可以免于重入?
4

2 回答 2

5

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

是的,正如另一个问题的答案向您展示的那样。

并同时完成?

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

于 2013-07-25T19:16:50.650 回答
3

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

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

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

于 2013-07-25T19:18:21.610 回答