-
Вот такой вопрос В описании метода ReadLn написано, что он предназначен для чтения из сокета до символа-разделителя, в течении таймаута или до приема максимальной длины строки. Но почему в моей программе при заданном таймауте и разделителе он не обрубается по таймауту, а ждет символа-разделителя, из за чего управление потоком блокируется до сообщения клиента. В чем может быть проблема?
-
Ну и пусть себе блокируется. Что в этом плохого ?
-
> Но почему в моей программе при заданном таймауте и разделителе > он не обрубается по таймауту,
значит, таймаут не настал
-
> Ну и пусть себе блокируется. Что в этом плохого ?
Плохо то, что дальше идут операции записи в сокет, которые долдны выполняться независимо от комманд клиента.
-
Ну так и выполняй их независимо.
-
"дальше" это где ?
-
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;
-
> valenok © (29.01.08 14:35) [6]
Код - в топку.
Тебя кто учил в доп.потоке обращаться к визуальным VCL-контролам ?
-
> Сергей М. (29.01.2008 14:44:07) [7]
Может сам догадался, а так есть две кандидатуры
-
...
Memo1.Lines.Add(users[i,2]+' '+s2));
...
-
Извиняюсь Не то отправил
...
users[i,3]:=IntToStr(ListBox1.Items.Add(s2+' '+AThread.Connection.Socket.Binding.IP+' in'));
...
Memo1.Lines.Add(users[i,2]+' '+s2));
...
А вот не пройдет?
-
> А вот не пройдет?
Не-а.
Такой же нопасаран, как и в [6], только вид сбоку)
-
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;
Так правильно?
-
> Так правильно?
Не-а.
> LabeledEdit1
Убирай !!
-
> > Так правильно? > > > Не-а. > > > > LabeledEdit1 > > > Убирай !!
Так читать с пользовательского интерфейса вроде можно и так.
-
Теперь это все я исправил. А все таки ответьте плиз на главный вопрос - почему ReadLn('#',5000,-1) не обрубается по таймауту в 5сек, а только при получении символа '#'
-
> valenok (29.01.2008 18:27:15) [15]
Просто 5 секунд приходятся на каждый символ. Документировано в справке.
-
> Anatoly Podgoretsky © (29.01.08 18:46) [16] > > valenok (29.01.2008 18:27:15) [15] > > Просто 5 секунд приходятся на каждый символ. > Документировано в справке.
А все таки что посоветуете сделать, чтоб работало как я хочу?
|