![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли заставить TIdTCPConnection сообщать о приходе данных? [D7, Win2k]
Zelius © (2003-04-29 17:28:00)На серверной стороне использую TidTcpServer, на клиенте TidTcpClient, хочу по одному каналау передавать данные как по инициативе клиента, так и сервера. Процедура оброботки TidTcpServer.OnExecute:
with aThread as TEPingConnThread do
begin
while NOT Terminated do
begin
HandleQueue; // отработать очередь данных на отсылку клиенту
if aThread.Connection.IOHandler.Readable(0) then HandleInput; // принять входящие данные
FEvent.WaitFor(500);
end;
end;
Мне не нравится интервал ожидания 500 мс, хочу от этого избавиться, но не знаю как это сделать с помощью Indy.
Zelius (2003-04-30 16:40:00) [41]
> Reindeer Moss Eater (30.04.03 16:23)
Именно вызов синхронного метода чтения (а в инди других нет) и приводит к блокированию потока! Чего я и хочу избежать! Я не специально блокирую поток, а наоборот пытаюсь этого избежать :)
Reindeer Moss Eater (2003-04-30 16:25:00) [42]В OnExecute надо либо читать, либо писать. Зачем блокировать нитку PeerThread????
Reindeer Moss Eater (2003-04-30 16:23:00) [43]Я посмотрел исходники - OnExecute вызывается не при появлении данных, а постоянно, пока соединение не закрыто и когда OnExecute возвращает управление! Что бы дождаться данных все равно надо вызывать ф-ию чтения и блокировать поток.
Reindeer Moss Eater (30.04.03 15:49)
Или что пора вызывать синхроныый метод чтения данных
Объясни тупому: блокировать-то зачем???
Zelius (2003-04-30 16:16:00) [44]
> Reindeer Moss Eater (30.04.03 16:06)
> А работаю я с потомком TidPeerThread для удобства, так как
> храню в нем данные необходимые для работы с каждым соединением.
>
> Излишество это.
> Есть TidPeerThread.Data в котором можно хранить ссылку на
> любые свои данные.
Прошу прощения, не только данные, я там еще несколько методов реализовал. Согласен, что тоже самое можно сделать разными способами, просто мне хотелось попробовать такой метод.
Zelius (2003-04-30 16:14:00) [45]
> Reindeer Moss Eater (30.04.03 15:59)
> А OnConnect когда по твоему генериться?
Из DoConnect, который в свою очередь из BeforeRun.
Я посмотрел исходники - OnExecute вызывается не при появлении данных, а постоянно, пока соединение не закрыто и когда OnExecute возвращает управление! Что бы дождаться данных все равно надо вызывать ф-ию чтения и блокировать поток.
Reindeer Moss Eater (2003-04-30 16:06:00) [46]А работаю я с потомком TidPeerThread для удобства, так как храню в нем данные необходимые для работы с каждым соединением.
Излишество это.
Есть TidPeerThread.Data в котором можно хранить ссылку на любые свои данные.
Reindeer Moss Eater (2003-04-30 15:59:00) [47]А OnConnect когда по твоему генериться?
Zelius (2003-04-30 15:57:00) [48]
> Reindeer Moss Eater (30.04.03 15:48)
Насколько я понял - OnExecute генерируется при установлении соединения, а не при приходе данных.
Reindeer Moss Eater (2003-04-30 15:49:00) [49]Или что пора вызывать синхроныый метод чтения данных
Reindeer Moss Eater (2003-04-30 15:48:00) [50]Исходный вопрос:
Можно ли заставить TIdTCPConnection сообщать о приходе данных?
Ответ:
Заставлять не надо. Будет сгенерено событие OnExecute, которое и сигнализирует, что данные есть.
Reindeer Moss Eater (2003-04-30 15:41:00) [51]на самом деле оно генерится не только когда есть что обрабатывать...
например когда у КЛИЕНТА ты вызываешь Read(...
когда клиент только что подключился - сразу же после обработки
OnConnect...и не факт что в этот момент есть что читать ОТ клиента...
Про ЧТЕНИЕот клиента я не упоминал.
OnExecute генерится только когда, когда есть что обрабатывать
И отдавать тики процессора другим нитям в этом обработчике нет никакой необходимости. Это то что я хотел сказать.
Zelius (2003-04-30 15:33:00) [52]
> $hade © (30.04.03 15:22)
Ты хочешь сказать, что можно одновременно из разных потоков по одному сокету принимать и посылать данные?
$hade (2003-04-30 15:25:00) [53]есть такая штука - TThreadList..подумай над этим на досуге...;-)
$hade (2003-04-30 15:22:00) [54]блин! а что тебе мешает сделать так:
var // глобальные переменные
Th:IdPeerThread;
...
OnConnect(AThread:TIdPeerThread);
begin
Th:=AThread;
end;
OnExecute(AThread...
begin
AThred.connectiom.read... то есть тут происходит ТОЛЬКО чтение от клиента....
end;
и все.... далее в ЛЮБОМ месте (когда тебе надо отправить клиенту данные)
Th.Connection.writebuffer например...
Не согласен??
ps:естественно тут только общее описание...конкретно - для одного клиента...а для нескольких клиентов - посложнее будет...там много нюансов...
Я делал реальный проект - оно работает...
Ежели что - пиши на мыло...
Zelius (2003-04-30 14:55:00) [55]
> Reindeer Moss Eater (30.04.03 14:03)
> Никакого "постоянного выполнения" и так не будет.
> OnExecute генерится только когда, когда есть что обрабатывать
Вы не правы, рекомендую посмотреть исходники Indy
Zelius (2003-04-30 14:54:00) [56]$hade © (30.04.03 14:06)
Дело в том, что я не могу блокировать поток отвечающий за прием данных, так как через него же хочу отправлять данные в произвольный момент, то есть на сервере произошло событие и мне надо об этом уведомить клиента, это может произойти в тот момент, когда поток будет висеть и ждать входящих данных.
А работаю я с потомком TidPeerThread для удобства, так как храню в нем данные необходимые для работы с каждым соединением.
$hade (2003-04-30 14:11:00) [57]2Reindeer Moss Eater
на самом деле оно генерится не только когда есть что обрабатывать...
например когда у КЛИЕНТА ты вызываешь Read(...
когда клиент только что подключился - сразу же после обработки
OnConnect...и не факт что в этот момент есть что читать ОТ клиента...
$hade (2003-04-30 14:06:00) [58]а с чего он его грузить будет??
делай в первой строке OnExecute
readbuffer(b,sizeof(b)); - тут будет сидеть до тех пор пока не получит sizeof(b) байт от клиента или до TimeOut"а...
handleInput;
>TEPingConnThread - это наследник TidPeerThread
и что он делает у тебя?
Приведи побольше кода...понятней будет что ты хочеь сделать...
Reindeer Moss Eater (2003-04-30 14:03:00) [59]Никакого "постоянного выполнения" и так не будет.
OnExecute генерится только когда, когда есть что обрабатывать
Zelius (2003-04-30 13:09:00) [60]Я его вставил, что бы этот поток не загружал процессор постоянным исполнением.
TEPingConnThread - это наследник TidPeerThread.