Главная страница
    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.055 c
2-1234160852
_Unname_
2009-02-09 09:27
2009.03.29
Вопрос по синхронизации!


15-1232743364
@!!ex
2009-01-23 23:42
2009.03.29
Удаленная работы бывает СТАБИЛЬНОЙ??


15-1233202441
Дмитрий С
2009-01-29 07:14
2009.03.29
Как определить легальность windows xp,...


1-1208087201
@!!ex
2008-04-13 15:46
2009.03.29
Может ли существовать форма без Applicationа?


15-1232949323
El
2009-01-26 08:55
2009.03.29
Исходные тексты программ





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский