TThread::Synchronize() > 在读取 Form 组件属性时?
TThread::Synchronize() > when reading Form component properties?
我的环境:
- C++ Builder XE4
- 使用 VCL 组件
我有一个关于 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 的未来版本中改变。因此,您通常应该将 属性 访问视为函数调用。
我的环境:
- C++ Builder XE4
- 使用 VCL 组件
我有一个关于 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 的未来版本中改变。因此,您通常应该将 属性 访问视为函数调用。