Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с компонентами в многопоточном приложении


__DATA__ ©   (2007-03-15 13:17:00) 

Есть у меня сетевое приложение в котором я слушаю порт и при появлении в нем данных создаю поток

 SocketThread := TServerThread.Create(false, ClientSocket);
...
procedure TServerThread.ClientExecute;
var
 SockStream : TWinSocketStream;
 FileInfo   : array [0..10000] of char;
 FileStream : TStream;
 BytesSent  : LongInt;
 nRead      : Integer;
begin
 try
   try
     SockStream := TWinSocketStream.Create(ClientSocket,10000);
     if SockStream.WaitForData(10000) then
     begin
       if not ClientSocket.Connected then
         Exit;
       str := ClientSocket.ReceiveText;//Copy(Socket.ReceiveText,Pos('/',Socket.ReceiveText),Pos(' HTTP/',Socket.ReceiveText)-Pos('/',Socket.ReceiveText));
...
str := Main.GetDataFromBase;

Main

function GetDataFromBase: Stirng;
begin
 if IbDataSet.Active = false then
   ibDataSet.Active := true;
 Result := IbDataSet.FieldByName('NAME_').AsString;
...end;


Так вот когда одновременно 2 потока обращаются к компоненту IbDataSet возникает ошибка.

Что делать в данной ситуации?


DrPass   (2007-03-16 18:44:00) [1]


> Сергей М. ©   (16.03.07 16:14) [16]

Ну дык, а я тебе про что говорю? %) Борланд, выпустив в свое время IB7, бодро отчиталась, что клиентская библиотека стала потокобезопасной, и дергай себе ее API из разных потоков на здоровье.

> Автор ни словом не обмолвился, что за СУБД он там пытает
> - то ли FB/YA, то ли IB)

Отож... ну, раз лезет через IBX к птичкам - значит, сам себе злобный Буратина :)


Сергей М.   (2007-03-16 16:14:00) [2]


> DrPass ©   (16.03.07 16:03) [15]


Так-с, приехали

Причем здесь VCL, когда речь идет о потокобезопасности внутренней логики самих ф-ций в составе IBAPI ?


> Ты у меня спрашиваешь?


А у кого еще ?)

Автор ни словом не обмолвился, что за СУБД он там пытает - то ли FB/YA, то ли IB)


DrPass   (2007-03-16 16:03:00) [3]


> Сергей М. ©   (16.03.07 15:44) [14]


> Прелюбопытно, какие ?

В смысле? Проблемы, свойственные всем компонентам VCL при использовании многопоточных приложений

> И почему именно IB7 ?

Ты у меня спрашиваешь? :) Это вопрос к разработчикам...


Сергей М.   (2007-03-16 15:44:00) [4]


> DrPass ©   (16.03.07 15:18) [13]


> Проблемы только в самих IBX


Прелюбопытно, какие ?
И почему именно IB7 ?


DrPass   (2007-03-16 15:18:00) [5]


> Сергей М. ©   (16.03.07 12:17) [12]


> вызовы тех или иных IBClientAPI-функций, потокобезопасность
> которых не гарантируется.

Почему? Уже давным-давно, еще с версии 7.0 клиентская библиотека Interbase абсолютно потокобезопасна. Проблемы только в самих IBX


Сергей М.   (2007-03-16 12:17:00) [6]


> DrPass ©   (16.03.07 12:11) [11]


> запросами и транзакциями можно будет рулить без синхронизации
>


С какого перепугу ?

И запросы и транзакции - это, в конечном итоге, вызовы тех или иных IBClientAPI-функций, потокобезопасность которых не гарантируется.


DrPass   (2007-03-16 12:11:00) [7]


> Сергей М. ©   (16.03.07 10:58) [9]

Это само собой. Я предлагал синхронизировать только создание и инициализацию компонент. Потом уже запросами и транзакциями можно будет рулить без синхронизации


Ega23   (2007-03-16 11:40:00) [8]


> Явная синхронизация (с пом. крит.секций или как-то иначе)
> мультипоточных обращений к серверу сводит на нет все преимущества
> мультипоточности.
>


Загнать данные в TClientDataSet, а обрабатывать уже - в своём потоке. Нпаример.
Хотя нафига так делать - тоже неясно.


Сергей М.   (2007-03-16 10:58:00) [9]


> DrPass ©   (16.03.07 10:41) [7]


Явная синхронизация (с пом. крит.секций или как-то иначе) мультипоточных обращений к серверу сводит на нет все преимущества мультипоточности.


Ega23   (2007-03-16 10:43:00) [10]


> Сергей М. ©   (16.03.07 10:22) [6]
>
> Если ты имеешь ввиду непосредственное обращение в ф-циям
> IBClientAPI, защищенное крит.секцией, то да, можно, но осторожно)


Я скорее имел ввиду что-то типа [7].


DrPass   (2007-03-16 10:41:00) [11]


> Для каждого потока создавать отдельный коннект к IB-серверу

Коннект можно и один, хендл коннекта может использоваться в многопоточных приложениях. Если используется IBX, можно создать одну IBDatabase, и для каждого потока с самого начала создать отдельные транзакции и датасеты, код их создания посадить в критические секции, т.к. при этом производится модификация свойств IBDatabase. После этого можно использовать эти компоненты без особой опаски в своих потоках, они в IBDatabase ничего писать не будут.


Сергей М.   (2007-03-16 10:22:00) [12]


> Ega23 ©   (16.03.07 10:18) [5]


Если ты имеешь ввиду непосредственное обращение в ф-циям IBClientAPI, защищенное крит.секцией, то да, можно, но осторожно)


Ega23   (2007-03-16 10:18:00) [13]


> Сергей М. ©   (16.03.07 08:23) [3]
>
>
> > А по другому никак?
>
>
> Никак.


На самом деле - можно. Но крайне геморно. 2 коннекта - гораздо проще и надёжнее.


Сергей М.   (2007-03-16 10:00:00) [14]

И, кстати, каков глубинный смысл создания объекта TWinSocketStream, если он по сути не используется тобой по своему прямому назначению ?


Сергей М.   (2007-03-16 08:23:00) [15]


> А по другому никак?


Никак.

А что тебя смущает ?


__DATA__   (2007-03-16 08:03:00) [16]

А по другому никак?


Сергей М.   (2007-03-15 13:37:00) [17]


> Что делать в данной ситуации?


Для каждого потока создавать отдельныйконнект к IB-серверу, соответственно и отдельные транзакции и отдельные дейтасеты


Наверх

Титульная страница Поиск, карта сайта Написать письмо