Форум: "Основная";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];
ВнизРабота с компонентами в многопоточном приложении Найти похожие ветки
← →
__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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.042 c