![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Спрошу еще раз... Про 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]а зачем это тебе ? у тебя что , идут такие ресурсожручие процессы во время работы с сокетами ?