在主线程中调用 TThread.Synchronize

Jan*_*gen 7 delphi multithreading delphi-10.3-rio

窃取 Uwe Raabe 的文章 使用参数进行同步和队列我这样做:

if GetCurrentThreadID = MainThreadID then
  FDataLogger(IntToStr(lNrItems) + ' elements:')
else
  TThread.Synchronize(nil,
          procedure
          begin
            FDataLogger(IntToStr(lNrItems) + ' elements:');
          end);
Run Code Online (Sandbox Code Playgroud)

但如果我只是

  TThread.Synchronize(nil,
          procedure
          begin
            FDataLogger(IntToStr(lNrItems) + ' elements:');
          end);
Run Code Online (Sandbox Code Playgroud)

这似乎也有效。

由于第一个构造会导致更多代码,那么区分主线程真的有很多好处吗?

Uwe*_*abe 5

尽管文档警告您这样做,但TThread.Synchronize中的实际代码类似于所示的包装代码。所以我很确定你可以使用较短的版本。

也许当我写那篇文章时,我也被文档误导了(或者在古代可能被Delphi 5左右的这种行为所困扰)。

  • 嗯,实际的实施可以说是无关紧要的。如果文档说该方法不能在主线程中使用,那么您可以说不能在主线程中使用它。即使你今天侥幸逃脱了惩罚,Embarcadero 也可以在未来自由地改变实现,因为他们可以假设所有优秀的开发人员都遵守文档给出的合同。只有当 Embarcadero 更改文档以允许这样做时,这样做才是安全的,因为 Embarcadero 承诺它是安全的,并且将保持安全。 (2认同)