Конференция "Сети" » Использование ReadLn в компоненте IdTCPServer
 
  • valenok © (29.01.08 12:23) [0]
    Вот такой вопрос
    В описании метода ReadLn написано, что он предназначен для чтения из сокета до символа-разделителя, в течении таймаута или до приема максимальной длины строки.
    Но почему в моей программе при заданном таймауте и разделителе он не обрубается по таймауту, а ждет символа-разделителя, из за чего управление потоком блокируется до сообщения клиента.
    В чем может быть проблема?
  • Сергей М. © (29.01.08 12:26) [1]
    Ну и пусть себе блокируется. Что в этом плохого ?
  • umbra © (29.01.08 13:07) [2]

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

    значит, таймаут не настал
  • valenok © (29.01.08 14:27) [3]

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

    Плохо то, что дальше идут операции записи в сокет, которые долдны выполняться независимо от комманд клиента.
  • Anatoly Podgoretsky © (29.01.08 14:29) [4]
    Ну так и выполняй их независимо.
  • Сергей М. © (29.01.08 14:32) [5]
    "дальше" это где ?
  • valenok © (29.01.08 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;
  • Сергей М. © (29.01.08 14:44) [7]

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


    Код - в топку.

    Тебя кто учил в доп.потоке обращаться к визуальным VCL-контролам ?
  • Anatoly Podgoretsky © (29.01.08 15:40) [8]
    > Сергей М.  (29.01.2008 14:44:07)  [7]

    Может сам догадался, а так есть две кандидатуры
  • valenok © (29.01.08 16:17) [9]

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


  • valenok © (29.01.08 16:19) [10]
    Извиняюсь
    Не то отправил

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


    А вот не пройдет?
  • Сергей М. © (29.01.08 16:23) [11]

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


    Не-а.

    Такой же нопасаран, как и в [6], только вид сбоку)
  • valenok © (29.01.08 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;

    Так правильно?
  • Сергей М. © (29.01.08 18:01) [13]

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


    Не-а.


    > LabeledEdit1


    Убирай !!
  • valenok © (29.01.08 18:04) [14]

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

    Так читать с пользовательского интерфейса вроде можно и так.
  • valenok © (29.01.08 18:27) [15]
    Теперь это все я исправил.
    А все таки ответьте плиз на главный вопрос - почему ReadLn('#',5000,-1) не обрубается по таймауту в 5сек, а только при получении символа '#'
  • Anatoly Podgoretsky © (29.01.08 18:46) [16]
    > valenok  (29.01.2008 18:27:15)  [15]

    Просто 5 секунд приходятся на каждый символ.
    Документировано в справке.
  • valenok © (30.01.08 20:11) [17]

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

    А все таки  что посоветуете сделать, чтоб работало как я хочу?
 
Конференция "Сети" » Использование ReadLn в компоненте IdTCPServer
Есть новые Нет новых   [134431   +14][b:0][p:0.001]