Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли заставить TIdTCPConnection сообщать о приходе данных? [D7, Win2k]


Страницы:   1 2 3 4

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.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо