TThread :: Synchronize()>读取表单组件属性时?

时间:2018-10-16 09:46:46

标签: multithreading c++builder

我的环境:

  • C ++ Builder XE4
  • 使用VCL组件

我对TThread:Synchronize()有疑问。

通常,当我从TThread例程()中更新表单组件(例如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例程读取表单组件属性时,是否还必须使用Synchronize()吗?

1 个答案:

答案 0 :(得分:1)

属性实际上是函数调用的语法糖。读一个还意味着一个函数被调用(好吧,在大多数情况下 [1] )。

换句话说,如果您在代码中执行了以下操作:

x = MyVCLObj->SomeProperty;

实际上,C ++ Builder编译器会为该属性生成对(通常是私有的)getter函数的调用:

x = MyVCLObj->GetSomeProperty();

该代码在主线程的上下文中运行,因此必须使用Synchronize()对其进行访问。


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