Главная страница
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.025 c
1-1208283210
Михаил
2008-04-15 22:13
2009.03.29
Как задать пределы шкалы по осям диаграммы Excel ?


9-1178217912
NDF
2007-05-03 22:45
2009.03.29
Помогите с DelphiX


2-1233804054
snake-as
2009-02-05 06:20
2009.03.29
При открытии файла через OpenDialog имя файла не сохраняется


8-1190302772
brother
2007-09-20 19:39
2009.03.29
Peak Meter реального времени


15-1232800135
ketmar
2009-01-24 15:28
2009.03.29
подскажите аналог Valgrind под винду, бесплатный