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

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

Использование ReadLn в компоненте IdTCPServer


valenok ©   (2008-01-29 12:23:00) 

Вот такой вопрос
В описании метода ReadLn написано, что он предназначен для чтения из сокета до символа-разделителя, в течении таймаута или до приема максимальной длины строки.
Но почему в моей программе при заданном таймауте и разделителе он не обрубается по таймауту, а ждет символа-разделителя, из за чего управление потоком блокируется до сообщения клиента.
В чем может быть проблема?


valenok   (2008-01-30 20:11:00) [1]


> Anatoly Podgoretsky ©   (29.01.08 18:46) [16]
> > valenok  (29.01.2008 18:27:15)  [15]
>
> Просто 5 секунд приходятся на каждый символ.
> Документировано в справке.

А все таки  что посоветуете сделать, чтоб работало как я хочу?


Anatoly Podgoretsky   (2008-01-29 18:46:00) [2]

> valenok  (29.01.2008 18:27:15)  [15]

Просто 5 секунд приходятся на каждый символ.
Документировано в справке.


valenok   (2008-01-29 18:27:00) [3]

Теперь это все я исправил.
А все таки ответьте плиз на главный вопрос - почему ReadLn('#',5000,-1) не обрубается по таймауту в 5сек, а только при получении символа '#'


valenok   (2008-01-29 18:04:00) [4]


> > Так правильно?
>
>
> Не-а.
>
>
> > LabeledEdit1
>
>
> Убирай !!

Так читать с пользовательского интерфейса вроде можно и так.


Сергей М.   (2008-01-29 18:01:00) [5]


> Так правильно?


Не-а.


> LabeledEdit1


Убирай !!


valenok   (2008-01-29 17:56:00) [6]


begin
 s1:='';
 s1:=AThread.Connection.ReadLn('#',5000,-1);{ Должно обрубаться через 5 секунд, но не обрубается}
if s1='conn' then               {Ïîäêëþ÷åíèå êëèåíòà}
 begin
   s2:=AThread.Connection.ReadLn('#',-1,-1);
   AThread.Connection.Write('conn#'+settings.LabeledEdit1.Text+'#');
   for i:=1 to 100 do
     if users[i,1]='' then
       begin
         users[i,1]:=AThread.Connection.Socket.Binding.IP;
         users[i,2]:=s2;
         users[i,3]:=onconn(s2+' '+AThread.Connection.Socket.Binding.IP+' in');
         users[i,4]:='1';
         break;
       end;
 end;
if s1='send' then               {Ïðèåì ñîîáùåíèÿ ñ êëèåíòà}
 begin
   s3:=AThread.Connection.ReadLn('#',-1,-1);
   val(s3,k,n);
   s2:=AThread.Connection.ReadString(k);
   for i:=1 to 100 do
     if AThread.Connection.Socket.Binding.IP=users[i,1] then begin onsend(users[i,2]+' '+s2); break end;
 end;
if messag.command='send' then  {Îòïðàâêà ñîîáùåíèÿ íà êëèåíò}
 begin

   AThread.Connection.Write(messag.send);
   messag.command:='';
 end;

Так правильно?


Сергей М.   (2008-01-29 16:23:00) [7]


> А вот не пройдет?


Не-а.

Такой же нопасаран, как и в [6], только вид сбоку)


valenok   (2008-01-29 16:19:00) [8]

Извиняюсь
Не то отправил

...
users[i,3]:=IntToStr(ListBox1.Items.Add(s2+' '+AThread.Connection.Socket.Binding.IP+' in'));
...
Memo1.Lines.Add(users[i,2]+' '+s2));
...

А вот не пройдет?


valenok   (2008-01-29 16:17:00) [9]


...
Memo1.Lines.Add(users[i,2]+' '+s2));
...


Anatoly Podgoretsky   (2008-01-29 15:40:00) [10]

> Сергей М.  (29.01.2008 14:44:07)  [7]

Может сам догадался, а так есть две кандидатуры


Сергей М.   (2008-01-29 14:44:00) [11]


> valenok ©   (29.01.08 14:35) [6]


Код - в топку.

Тебя кто учил в доп.потоке обращаться к визуальным VCL-контролам ?


valenok   (2008-01-29 14:35:00) [12]

begin
 s1:='';
 s1:=AThread.Connection.ReadLn('#',-1,-1); {Это проблемная операция}
if s1='conn' then               {Подключение клиента}
 begin
   s2:=AThread.Connection.ReadLn('#',-1,-1);
   AThread.Connection.Write('conn#'+settings.LabeledEdit1.Text+'#');
   for i:=1 to 100 do
     if users[i,1]='' then
       begin
         users[i,1]:=AThread.Connection.Socket.Binding.IP;
         users[i,2]:=s2;
         users[i,3]:=IntToStr(ListBox1.Items.Add(s2+' '+AThread.Connection.Socket.Binding.IP+' in'));
         users[i,4]:=1;
         break;
       end;
 end;
if s1='send' then               {Прием сообщения с клиента}
 begin
   s3:=AThread.Connection.ReadLn('#',-1,-1);
   main.Caption:=s3;
   val(s3,k,n);
   s2:=AThread.Connection.ReadString(k);
   for i:=1 to 100 do
     if AThread.Connection.Socket.Binding.IP=users[i,1] then begin Memo1.Lines.Add(users[i,2]+' '+s2); break end;
 end;
if messag.command='send' then  {Отправка сообщения на клиент}
 begin

   AThread.Connection.Write(messag.send);
   messag.command:='';
 end;
end;


Сергей М.   (2008-01-29 14:32:00) [13]

"дальше" это где ?


Anatoly Podgoretsky   (2008-01-29 14:29:00) [14]

Ну так и выполняй их независимо.


valenok   (2008-01-29 14:27:00) [15]


> Ну и пусть себе блокируется. Что в этом плохого ?

Плохо то, что дальше идут операции записи в сокет, которые долдны выполняться независимо от комманд клиента.


umbra   (2008-01-29 13:07:00) [16]


> Но почему в моей программе при заданном таймауте и разделителе
> он не обрубается по таймауту,

значит, таймаут не настал


Сергей М.   (2008-01-29 12:26:00) [17]

Ну и пусть себе блокируется. Что в этом плохого ?


Наверх

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