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

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

Спрошу еще раз... Про TServerSocket [D6, WinXP]


NorthMan ©   (2004-04-23 13:43:00) 

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

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

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


Глеб   (2004-05-31 10:50:00) [1]

Даёшь TESTER!!!!!

А ещё SS Chat (created by iraizor)


Digitman   (2004-04-23 17:08:00) [2]


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


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

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


NorthMan   (2004-04-23 16:17:00) [3]

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


Digitman   (2004-04-23 16:07:00) [4]


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


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

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

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


NorthMan   (2004-04-23 15:41:00) [5]

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


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


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


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

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

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


NorthMan   (2004-04-23 15:10:00) [7]

Еще вопрос: если я передаю строку длиной 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 14:57:00) [8]


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


да


NorthMan   (2004-04-23 14:09:00) [9]

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


Digitman   (2004-04-23 13:51:00) [10]


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


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

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


Iraizor   (2004-04-23 13:50:00) [11]

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


Наверх

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