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