在AnonymousThread中使用TThread.Synchronize的目的是什么?

时间:2015-10-07 18:19:17

标签: delphi thread-safety firemonkey

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

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

在这种情况下真的有必要使用TThread.Synchronize吗?

1 个答案:

答案 0 :(得分:5)

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

TThread.Synchronize的作用是 - 它将程序与一个可等待的对象一起包装,将其放入队列,然后等待句柄 - 它可以向主线程发送一条消息以将其唤醒。

如果TButton.Text背后的代码是通过发布消息实现的 - 而不是 - 从其他线程调用是安全的,但它不会立即生效。

长话短说 - 你必须通过Synchronize来调用它,原因很简单。