TThread::Synchronize() > 在读取 Form 组件属性时?

TThread::Synchronize() > when reading Form component properties?

我的环境:

我有一个关于 TThread:Synchronize() 的问题。

通常,当我从 TThread routine() 更新 表单组件(例如 Text->Caption)时,我使用 Synchronize()。

__fastcall TThreadSample::Execute()
{
    Synchronize(&updateFormText);
}

其中 updateFormText() 是更新表单文本->标题的函数。

另一方面,当我 阅读 表单文本的标题时,我使用了以下没有 Synchronize() 的内容。

__fastcall TThreadSample::DoRead()
{
    String acap = CFormXXX::GetTextCaption();
}

void __fastcall CFormXXX::GetTextCaption()
{
    return FormXXX->TextXXX->Text;
}

问题:当我从 TThread 例程读取 Form 组件属性时,是否也必须使用 Synchronize()?

属性实际上是函数调用的语法糖。阅读一个也意味着一个函数被调用(好吧,大多数时候[1])。

换句话说,如果在您的代码中:

x = MyVCLObj->SomeProperty;

C++Builder 编译器实际上会为 属性:

生成对 getter 函数的调用(通常是私有的)
x = MyVCLObj->GetSomeProperty();

它在主线程的上下文中运行,因此必须使用 Synchronize() 访问它。


[1] 我知道并非所有属性都如此,您可能会直接访问成员字段(例如 FSomeProperty),但您真的要检查吗文档每次?这也可能在 class 的未来版本中改变。因此,您通常应该将 属性 访问视为函数调用。