Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];

Вниз

Использование 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.121 c
2-1233739538
zorik
2009-02-04 12:25
2009.03.29
Смена типа на ходу


15-1233142456
XeON
2009-01-28 14:34
2009.03.29
Обрезка изображения


2-1233732829
проходил мимо решил зайти
2009-02-04 10:33
2009.03.29
Сортировка данных таблице


2-1234160852
_Unname_
2009-02-09 09:27
2009.03.29
Вопрос по синхронизации!


4-1207047506
kolj
2008-04-01 14:58
2009.03.29
Tapi -> CallBackFunction





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский