TThread :: Synchronize ()> при чтении свойств компонента формы? - PullRequest
0 голосов
/ 16 октября 2018

Моя среда:

  • C ++ Builder XE4
  • с использованием компонента VCL

У меня вопрос по TThread: Synchronize ().

Обычно я использую Synchronize (), когда я обновляю Компонент формы (например, Text-> Caption) из подпрограммы TThread ().

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

, где updateFormText () имеет значениефункция для обновления текста формы-> Заголовок.

С другой стороны, когда я прочитал заголовок из текста формы, я использовал следующие элементы без Synchronize ().

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

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

Вопрос: Должен ли я использовать Synchronize () также, когда я читаю Свойства компонента формы из подпрограммы TThread?

1 Ответ

0 голосов
/ 16 октября 2018

Да .

Свойства на самом деле являются синтаксическим сахаром для вызовов функций.Чтение одного также означает, что функция вызывается ( хорошо, большую часть времени [1] ).

Другими словами, если в вашем коде вы делаете:

x = MyVCLObj->SomeProperty;

компилятор C ++ Builder фактически генерирует вызов (обычно частной) функции-получателя для свойства:

x = MyVCLObj->GetSomeProperty();

, который выполняется в контексте основногонить, поэтому к нему нужно обращаться, используя Synchronize().


[1] Я знаю, что это не так для всех свойств, и вы вполне можете получить доступ к полю-члену (например, FSomeProperty) напрямую, но вы действительно хотите каждый раз проверять документы?И это может измениться в будущей версии класса тоже.Таким образом, вы обычно должны рассматривать доступ к свойству как вызов функции.

...