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

Вниз

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

 
__DATA__   (2007-03-15 13:17) [0]

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

 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 возникает ошибка.

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


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


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


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


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

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


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


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


Никак.

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


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

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


 
Ega23 ©   (2007-03-16 10:18) [5]


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


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


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


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


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


 
DrPass ©   (2007-03-16 10:41) [7]


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

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


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


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


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


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


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


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


 
Ega23 ©   (2007-03-16 11:40) [10]


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


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


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


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

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


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


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


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


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

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


 
DrPass ©   (2007-03-16 15:18) [13]


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


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

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


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


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


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


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


 
DrPass ©   (2007-03-16 16:03) [15]


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


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

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

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

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


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


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


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

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


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


А у кого еще ?)

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


 
DrPass ©   (2007-03-16 18:44) [17]


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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.05.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.042 c
15-1176751428
vasIZmax
2007-04-16 23:23
2007.05.13
Дети рисуют Путина)))


2-1176974557
Creative
2007-04-19 13:22
2007.05.13
Обращение к полям рекорда


2-1176900316
dzhagr
2007-04-18 16:45
2007.05.13
Tquery


2-1176986449
ppcumax
2007-04-19 16:40
2007.05.13
Пишу текстовой редактор, нужна помощь


2-1177430954
sat
2007-04-24 20:09
2007.05.13
Delphi + ассемблер