Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.038 c
15-1176215379
ProgRAMmer Dimonych
2007-04-10 18:29
2007.05.13
Что с математикой???


1-1173974496
Маша_Семенова
2007-03-15 19:01
2007.05.13
шифр Вижинера


8-1156246891
Zeleniy
2006-08-22 15:41
2007.05.13
удаление содержимого звукового файла


2-1177081108
ppcumax
2007-04-20 18:58
2007.05.13
Как переносить строки длинее 100 символов?


6-1163190483
Unleashed
2006-11-10 23:28
2007.05.13
Создание виртуального сетевого интерфейса





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