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

Вниз

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

 
valenok ©   (2008-01-29 12:23) [0]

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


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

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


 
umbra ©   (2008-01-29 13:07) [2]


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

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


 
valenok ©   (2008-01-29 14:27) [3]


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

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


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

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


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

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


 
valenok ©   (2008-01-29 14:35) [6]

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:44) [7]


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


Код - в топку.

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


 
Anatoly Podgoretsky ©   (2008-01-29 15:40) [8]

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

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


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


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



 
valenok ©   (2008-01-29 16:19) [10]

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

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

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


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


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


Не-а.

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


 
valenok ©   (2008-01-29 17:56) [12]


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 18:01) [13]


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


Не-а.


> LabeledEdit1


Убирай !!


 
valenok ©   (2008-01-29 18:04) [14]


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

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


 
valenok ©   (2008-01-29 18:27) [15]

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


 
Anatoly Podgoretsky ©   (2008-01-29 18:46) [16]

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

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


 
valenok ©   (2008-01-30 20:11) [17]


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

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



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

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

Наверх




Память: 0.51 MB
Время: 0.024 c
2-1233182555
programmer90
2009-01-29 01:42
2009.03.29
Копирование TreeView-шных Item-ом


3-1217238791
Fynjy
2008-07-28 13:53
2009.03.29
как вручную создать TIBDataBase


15-1232633470
Городской Шаман
2009-01-22 17:11
2009.03.29
Вопрос по газовым проточным водонагревателям(колонка).


2-1233132780
Валера
2009-01-28 11:53
2009.03.29
Перевод значения в бинарный код


2-1233477208
jonin
2009-02-01 11:33
2009.03.29
загрузка процессора