我在寻找后台方法来执行firemonkey中的任务时遇到了这段Delphi代码。

TThread.CreateAnonymousThread(
            procedure()
            begin
                Sleep(10000);
                TThread.Synchronize(TThread.CurrentThread,
                procedure
                begin
                    Button2.Text := 'OK';
                end);
            end).Start;


在这种情况下真的需要TThread.Synchronize吗?

最佳答案

TButton.Text更改Window对象的属性,该属性本质上是非线程安全的,并且只能从创建它的线程中直接访问,也可以通过消息发送/发布来访问。

TThread.Synchronize所做的是-将过程与可等待的对象包装在一起,将其放入队列,然后在句柄上等待-它将消息发布到主线程以将其唤醒。

如果TButton.Text背后的代码是通过发布的消息实现的,而实际上不是,则可以从其他线程进行调用,但不会立即生效。

长话短说-出于充分的理由,您绝对必须通过Synchronize调用它。

关于delphi - 在AnonymousThread中使用TThread.Synchronize的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32999642/

10-12 02:12