Использование
главного CLX-потока
Когда вы применяете в своем
приложении объекты из библиотеки визуальных компонентов, то вам нужно иметь
в виду, что свойства и методы объектов из CLX не гарантируют потоковую безопасность.
В случае, когда все объекты
обращаются к своим свойствам и выполняют свои методы в одном потоке, вам не
нужно беспокоиться о том, что объекты будут создавать друг другу помехи.
Для использования главного
CLX-потока создайте отдельную процедуру, которая выполняет необходимые действия.
А затем вызовите эту процедуру из вашего потокового модуля (внутри метода Execute
),
применив синхронизацию. Например, как представлено в листинге 14.7.
Листинг 14.7. Использование
синхронизации
procedure TMyThread.PushTheButton; begin
Button1.Click; end;
end;
procedure TMyThread.Execute; begin
. . . Synchronize(PushTheButton);
. . .
Метод синхронизации защитит
ваше приложение от ситуации "гонки".
Ситуация "гонки"
возникает, когда два потока или более пытаются получить доступ к общему ресурсу
и изменить его состояние.
Примечание
Метод синхронизации не может использоваться в консольных приложениях Для защиты одновременного доступа к CLX-объектам в консольных приложениях вы должны использовать другие методы, такие как критические секции
В некоторых случаях вы
можете обходиться без метода синхронизации, например, если:
(Data access)
являются потокобезопасными в том случае,
когда каждый поток обращается к собственной базе данных; Примечание
Когда вы используете
компоненты доступа к данным, вы должны применять синхронизацию в том случае,
если устанавливаете связь между компонентами доступа к данным (например,
свойство DataSet
в объекте DataSource
). Но вы
можете не прибегать к синхронизации при обращении к данным таблицы базы
данных
TFont,
TPen
, TBrush, TBitmap, TDrawing
и TIcon
;(List)
, которые не являются потокобезопасными, вы можете использовать
потокобезопасный потомок объекта TList — TThreadList
.