Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.15;
Скачать: CL | DM;

Вниз

Вопрос по синхронизации тредов с 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
1-1279183953
TKN
2010-07-15 12:52
2012.01.15
QuickReport - вывести в файл


2-1317972414
ЕД
2011-10-07 11:26
2012.01.15
TcxDBLookUpComboBox в TcxDBVerticalGrid


2-1317934451
Евгений07
2011-10-07 00:54
2012.01.15
MySql через интернет и Дельфи 6


15-1316688403
boriskb
2011-09-22 14:46
2012.01.15
Деньжат конечно маловато, но и работа не трудная


2-1317643451
Очень Злой
2011-10-03 16:04
2012.01.15
TFileStream