Форум: "Сети";
Текущий архив: 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