Delphi – является ли TClientDataset потокобезопасным?

StackOverflow https://stackoverflow.com/questions/669319

  •  21-08-2019
  •  | 
  •  

Вопрос

У меня есть TClientDataset, который управляется в потоке 1.

В другом потоке у меня есть клонированное изображение TClientDataset.

Будут ли у меня проблемы с потоками?

Редактировать

Клонированное изображение используется в режиме только для чтения.

Это было полезно?

Решение

Короткий ответ: нет, ClientDataSet не является потокобезопасным.Более сложный ответ заключается в том, что это зависит от того, как вы его используете.Независимо от того, сколько у вас клонов ClientDataSet, их можно безопасно использовать из нескольких потоков, пока вы только читаете данные.Это верно, даже если вы устанавливаете разные диапазоны, текущие записи, фильтры и т. д.

И, хотя вы об этом не просили, вы можете без проблем освободить любой из клонированных ClientDataSet, даже исходный клонированный ClientDataSet.

С другой стороны, если возникнет необходимость опубликовать запись в каком-либо из клонов или перезагрузить данные, необходимо использовать объект синхронизации.Если изменения происходят редко, для этой цели отлично подойдет класс TMultiReadExclusiveWriteSynchronizer.

Другие советы

В мире:Нет.

Весь VCL следует считать «потокобезопасным».Любые вызовы визуальных компонентов в TThread должны выполняться в событии Synchronize.

Любой класс VCL/RTL должен быть полностью создан и уничтожен внутри TThread.

Процесс клонирования должен обрабатываться с помощью TCriticalSection, но каждый TClientDataSet должен работать в своем собственном потоке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top