Главная страница
    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-1317792498
petvv
2011-10-05 09:28
2012.01.15
Array of Char to String (ANSIString)=:


15-1317129600
OW
2011-09-27 17:20
2012.01.15
Никто случайно Lotus к Oracle не подключал? или к MSSQL


2-1318095947
Pcrepair
2011-10-08 21:45
2012.01.15
Ctrl+A и Ctrl+C в компоненте TWebBrowser


1-1279271153
gosha52
2010-07-16 13:05
2012.01.15
TButton, Windows Vista/7, интересное поведение


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский