Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1318188503
Евгений07
2011-10-09 23:28
2012.01.15
В GraphicEx: нет LoadFromStream для Image


15-1317550613
Loginov Dmitry
2011-10-02 14:16
2012.01.15
Indy - работа с электронной почтой


15-1316555083
Джо
2011-09-21 01:44
2012.01.15
Сша, психоделик, 60-е.


2-1317823891
SergP
2011-10-05 18:11
2012.01.15
Рекурсивное описание классов.


1-1279883255
killy
2010-07-23 15:07
2012.01.15
Variant как ссылка на OLE-объект





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский