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

Вниз

Спрошу еще раз... Про TServerSocket   Найти похожие ветки 

 
NorthMan ©   (2004-04-23 13:43) [0]

На этот раз короче. Вопрос такой: сервер, неблок.сокет.
К серверу подключены несколько клиентов.

В методе ServerClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
пишу
begin
 s:=Socket.ReceiveText;
 ActThrd:= TActThrd.Create(s);
end;

Таким образом пытаюсь переложить основную нагрузку из основного на дополнительный поток. Но основное окно всеравно подвисает.
Может нужно иначе делать?


 
Iraizor ©   (2004-04-23 13:50) [1]

а зачем это тебе ? у тебя что , идут такие ресурсожручие процессы во время работы с сокетами ?


 
Digitman ©   (2004-04-23 13:51) [2]


> Может нужно иначе делать?


разумеется - иначе ! не изобретать велосипед непонятно по какой причине, а воспользоваться штатным режимом stThreadBlocking - там управление потоками "вылизано" до последней пылинки

что ты выиграл, стартуя трэд "ручками" ?


 
NorthMan ©   (2004-04-23 14:09) [3]

Видимо, я не совсем представляю работу сокетов в режиме stThreadBlocking. Как я понял, в этом режиме для каждого клиента создается свой поток и в нем идет вся работа?


 
Digitman ©   (2004-04-23 14:57) [4]


> в этом режиме для каждого клиента создается свой поток и
> в нем идет вся работа?


да


 
NorthMan ©   (2004-04-23 15:10) [5]

Еще вопрос: если я передаю строку длиной 50 байт, на сервере использую метод Read(buf, n), где n-длина буфера. Пусть n=10. На что это влияет?

   while (not Terminated) and ClientSocket.Connected do
   begin
     if MySocket.WaitForData(2000) then
       begin
         MySocket.Read(Buffer, 10);
         
       end;
   end;


 
Digitman ©   (2004-04-23 15:26) [6]


> На что это влияет?


ни на что абсолютно

если из посланных 50 байт на момент Read() доступны все 50 байт, то при n = 10 ты прочитаешь ровно 10 байт, оставшиеся 40 байт никуда не денутся - ты их сможешь прочитать при следующем Read()

если из посланных 50 байт на момент Read() доступны всего 5 байт, то при n = 10 ты прочитаешь ровно 5 байт, оставшиеся 45 еще не "доехали" , жди их циклическим вызовом Read() и рано или поздно сможешь их получить, если ничто не случится с трансп.каналом


 
NorthMan ©   (2004-04-23 15:41) [7]

т.е. в приведенном коде все 50 байт будут прочитаны, это просто вопрос времени и никаких дополнительных циклов на Read не надо?


 
Digitman ©   (2004-04-23 16:07) [8]


> т.е. в приведенном коде все 50 байт будут прочитаны


вовсе не обязательно

будет прочитано ровно столько байт, сколько доступны на принимающей стороне на момент успешного возврата из WaitFor()

WaitFor() извещает лишь о том, что доступны и не прочитаны тобой некие данные, о факт.размере которых можно судить только после попытки их прочтения


 
NorthMan ©   (2004-04-23 16:17) [9]

ага, т.е. чтобы принять все 50 байт нужно будет при каждом приеме проверять, все ли 50 байт приняты?


 
Digitman ©   (2004-04-23 17:08) [10]


> NorthMan ©   (23.04.04 16:17) [9]


а как ты хотел иначе ?

сеть (тем паче глобальная) - штука сложная, пока по ее "неведомым дорожкам" доберутся ожидаемые 50 байт. придется таки "помучиться" - на каждом "повороте" каждый байт из состава 50-ти ждет куча приключений ...


 
Глеб ©   (2004-05-31 10:50) [11]

Даёшь TESTER!!!!!

А ещё SS Chat (created by iraizor)



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

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

Наверх




Память: 0.49 MB
Время: 0.024 c
14-1089215993
rOOse
2004-07-07 19:59
2004.07.25
Компонент TEdit


14-1089121529
QuasiLamo
2004-07-06 17:45
2004.07.25
SQL


3-1088423557
Igoryok
2004-06-28 15:52
2004.07.25
Установка MSDE


3-1087997050
overstep
2004-06-23 17:24
2004.07.25
Получение выходного параметра


4-1087126783
SergeyM
2004-06-13 15:39
2004.07.25
Раскладка клавиатуры