Форум: "Основная";
Текущий архив: 2012.01.15;
Скачать: [xml.tar.bz2];
ВнизВопрос по синхронизации тредов с VCL. Найти похожие ветки
← →
Дмитрий Белькевич (2010-07-22 11:11) [0]Известно, что при обращении из дополнительных потоков к VCL возникают проблемы.
Интересно, с чем конкретно возникают проблемы? Только с визуальными контролами, или с чем-то еще? Или вообще со всем, что TObject (или TComponent) и выше?
Конкретный вопрос. С TIBQuery могут возникнуть проблемы при обращении из неосновного потока? Предполагается, что гарантируется, что одновременно с TIBQuery работает только один поток - или основной или дополнительный.
← →
Медвежонок Пятачок © (2010-07-22 12:27) [1]принцип простой.
весь вцл потоконебезопасный.
в иных случаях (когда класс потокобезопасный) это специально оговорено в хелпе.
датасеты (вроде все ) - потокобезопасные
← →
Deltas © (2010-07-22 12:45) [2]Методы экземпляра любого класса обычно (но не всегда) не потокобезопасны. То есть с объектом может работать только один поток. Компоненты VCL не потокобезопасны, даже в случае работы с разными экземплярами разных классов, потому что методы экземпляров этих классов обращаются к глобальным переменным, не защищенны критическими секциями. Так ведут себя не все классы, например с TForm можно работать только из основного потока, а с TStingList и из дополнительных (доп. поток создал объет, поработал с ним, удалил).
Что касается TIBQuery, про его потокобезопасность справка молчит. Самый надежный способ - полностью просмотреть работу компонента TIBQuery (IBQuery.pas не очень большой) и определить потокобезопасен он для работы из дополнительных потоков или нет.
P.S. Я бы не стал использовать класс TIBQuery в доп. потоке, слишком рисковано. Можно отправлять почтовые сообщения главному потоку, который сам сделает с TIBQuery все, что нужно. Если так уж необходимо отправлять запросы СУБД в доп. потоке, то можно спуститься с уровня компонентов VCL до уровня прослойки BDE API.
← →
sniknik © (2010-07-22 19:34) [3]> Предполагается, что гарантируется, что одновременно с TIBQuery работает только один поток - или основной или дополнительный.
т.е. предполагается, что гарантируется работа через синхронизацию? или критическими секциями гарантий добиваешься? тогда тебе не о чем волноваться.
← →
Дмитрий Белькевич (2010-07-22 19:36) [4]Критическими, да.
← →
Игорь Шевченко © (2010-07-22 23:43) [5]
> Известно, что при обращении из дополнительных потоков к
> VCL возникают проблемы.
не только к VCL
> Предполагается, что гарантируется, что одновременно с TIBQuery
> работает только один поток - или основной или дополнительный.
>
А как соединение (IBConnection вроде) относится к тому, что его будут разные потоки дергать ? Я не знаю.
← →
_Юрий (2010-07-23 19:06) [6]если все IB компоненты (подключения и дата-сеты) в одном и том же дополнительном потоке, то проблем нет.
← →
_Юрий (2010-07-23 19:14) [7]В общем, если из отдельного потока - то там должно быть свое подключение, своя транзакция, свой дата-сет.
Если же требуется работать обязательно в рамках основного подключения( которое установлено в основном потоке), то я бы не стал поручать доп. потоку работу с БД. Пусть переправляет данные основному потоку, а тот уже пусть работает с базой.
← →
Loginov Dmitry © (2010-07-25 17:52) [8]
> Что касается TIBQuery, про его потокобезопасность справка
> молчит. Самый надежный способ - полностью просмотреть работу
> компонента TIBQuery (IBQuery.pas не очень большой) и определить
> потокобезопасен он для работы из дополнительных потоков
> или нет.
Множество раз данная тема обсуждалась и продолжает обсуждаться с завидной регулярностью. Соответственно любой поисковик знает все о потокобезопасности TIBQuery, и справка никакая не нужна.
> P.S. Я бы не стал использовать класс TIBQuery в доп. потоке,
> слишком рисковано.
Создается свой TIBQuery в каждом доп. потоке, и нет никакого риска.
А вот со всеми стандартными компонентами подключений типа TXXXDateBase / TXXXConnection (в том числе TIBDataBase) беда. Для каждого потока должно быть свое подключение, иначе ошибок не миновать (хотя и тут многие программы до поры до времени умудряются работать без ошибок). Раньше (во времена D7) нельзя было создавать TIBDataBase в доп. потоке (рискованно было). Теперь риска нет. Прогресс однако. Правда одновременно устанавливать подключения к базе данных из разных потоков одного приложения по прежнему не рекомендуется.
← →
Дмитрий Белькевич (2010-07-26 10:37) [9]С TIBQuery, в целом, понятно. С остальными как? Всё визуальное, я так понимаю, небезопасно использовать без синхронизации. А вот остальное, например, какой-нибудь TOpenDialog или индиевские компоненты?
>Самый надежный способ - полностью просмотреть работу компонента TIBQuery (IBQuery.pas не очень большой)
Если бы не было предков :)
← →
Игорь Шевченко © (2010-07-26 12:53) [10]
> А вот остальное, например, какой-нибудь TOpenDialog
TOpenDialog тоже визуальный компонент
← →
Leonid Troyanovsky © (2010-07-26 14:29) [11]
> Игорь Шевченко © (26.07.10 12:53) [10]
> TOpenDialog тоже визуальный компонент
Еще и со своими доп. потоками.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2012.01.15;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c