gpt4 book ai didi

multithreading - 我可以将 Delphi TThread.Synchronize() 本地移动到 VCL 表单,以便从主线程或工作线程调用吗?

转载 作者:行者123 更新时间:2023-12-03 15:49:56 26 4
gpt4 key购买 nike

我正在使用 CreateAnonymousThread 来执行辅助任务,当我开始使用它时,我按照记录的示例在整个声明中使用了 Synchronize,例如:

procedure Txxx.RunWorker;
begin
FExecutionThread := TThread.CreateAnonymousThread(procedure ()
begin

TThread.Synchronize (TThread.CurrentThread,
procedure ()
begin
// Here before worker stuff
NotifyBeforeWorkerStuff;

end);

// Do worker stuff

TThread.Synchronize (TThread.CurrentThread,
procedure ()
begin
// Here after worker stuff
NotifyAfterWorkerStuff;
end);
end);

FExecutionThread.Start;
end;
end;

如您所见,在此线程中,我向应用程序的各个部分启动事件通知,包括 VCL 表单(NotifyBeforeWorkerStuff 等)。后来,我发现我可以将 Synchronize() 更本地地移动到每个 VCL 表单,接近更新(非安全)VCL 控件实际需要的位置:

    procedure TSomeVCLForm.ReceiveNotification;
begin
TThread.Synchronize (TThread.CurrentThread,
procedure ()
begin
Label1.Caption := GetSomeStringFunction;
end);
end;

只要我接受来自主线程或工作线程的通知,工作线程就会变得更简单:

   procedure Txxx.RunWorker;
begin
FExecutionThread := TThread.CreateAnonymousThread(procedure ()
begin

NotifyBeforeWorkerStuff;

// Do worker stuff

NotifyAfterWorkerStuff;

end);

FExecutionThread.Start;
end;

我对这是否正确有几个疑问:

  1. 我的通知可能来自工作线程,也可能来自主线程(例如,源自按下按钮)。那么,当从主线程调用VCL表单上的“ReceiveNotification”时,是否允许像上面那样调用TThread.Synchronize? the XE8 docs暗示不是,但检查 System.Classes 看起来没问题并且工作正常。
  2. 在“ReceiveNotification”中,当 Label1.Caption 从 GetSomeStringFunction 获取字符串时,即使调用来自工作线程,也绝对不需要在该函数内锁定,这是否正确?

感谢您的建议。

最佳答案

文档说:

Warning: Do not call Synchronize from within the main thread. This can cause an infinite loop.

我认为文档完全是错误的。 XE8中的实现检查当前线程是否为主线程。如果是则直接执行该方法。

ReceiveNotification 中不需要锁定,因为对 GetSomeStringFunction 的调用始终在主线程上执行。

关于multithreading - 我可以将 Delphi TThread.Synchronize() 本地移动到 VCL 表单,以便从主线程或工作线程调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29919183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com