Delphi – является ли TClientDataset потокобезопасным?
-
21-08-2019 - |
Вопрос
У меня есть TClientDataset, который управляется в потоке 1.
В другом потоке у меня есть клонированное изображение TClientDataset.
Будут ли у меня проблемы с потоками?
Редактировать
Клонированное изображение используется в режиме только для чтения.
Решение
Короткий ответ: нет, ClientDataSet не является потокобезопасным.Более сложный ответ заключается в том, что это зависит от того, как вы его используете.Независимо от того, сколько у вас клонов ClientDataSet, их можно безопасно использовать из нескольких потоков, пока вы только читаете данные.Это верно, даже если вы устанавливаете разные диапазоны, текущие записи, фильтры и т. д.
И, хотя вы об этом не просили, вы можете без проблем освободить любой из клонированных ClientDataSet, даже исходный клонированный ClientDataSet.
С другой стороны, если возникнет необходимость опубликовать запись в каком-либо из клонов или перезагрузить данные, необходимо использовать объект синхронизации.Если изменения происходят редко, для этой цели отлично подойдет класс TMultiReadExclusiveWriteSynchronizer.
Другие советы
В мире:Нет.
Весь VCL следует считать «потокобезопасным».Любые вызовы визуальных компонентов в TThread должны выполняться в событии Synchronize.
Любой класс VCL/RTL должен быть полностью создан и уничтожен внутри TThread.
Процесс клонирования должен обрабатываться с помощью TCriticalSection, но каждый TClientDataSet должен работать в своем собственном потоке.