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

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

Обработчик прихода данных для TIdTCPClient [WinXP]


Alik ©   (2009-03-01 16:52:00) 

Добрый день,

Столкнулся с проблемой создания обработчика поступления данных для INDY компоненты TIdTCPClient. В TIdTCPServer есть такая обработка - OnExecute.

Пробовал например так, в событии Таймера делаю
TIdTCPClient.Readln, работает, но когда буффер пустой появляется  исключение. Как блокировать это исключение или
можно ли узнать есть ли что-нибудь в буфере перед тем как вызвать Readln?


DVM   (2009-03-02 22:13:00) [1]


> Alik   (02.03.09 12:38) [7]


> А может ли вообще Client узнать, что у него пришли данные
> во входящий регистр не вызывая функций чтения Readln и др.
> , которые в случае отсутствия данных вываливают сообщение
> о таймауте.

Не может, инди - это синхронные блокирующие сокеты, они вообще не вписываются в событийную модель Windows.


Eraser   (2009-03-02 20:47:00) [2]

> [13] Alik   (02.03.09 20:26)

можно скачать Делфи 2009 )


Alik   (2009-03-02 20:26:00) [3]

> Eraser ©   (02.03.09 19:08) [12]

Удивительно, но осутствует даже метод IDTCPCLient1.IOHandler.ReadFromSource !

Видимо я капитально отстал от жизни (

А можно где скачать free обновленные компонентки?


Eraser   (2009-03-02 19:08:00) [4]

> [11] Alik   (02.03.09 17:11)

возможно у тебя более старая версия Indy. вот исходник этой функции
function TIdIOHandler.CheckForDataOnSource(ATimeout: Integer = 0): Boolean;
begin
 // return whether at least 1 byte was received
 Result := False;
 if Connected then begin
   Result := ReadFromSource(False, ATimeout, False) > 0;
 end;
end;


Alik   (2009-03-02 17:11:00) [5]

Eraser ©   (02.03.09 13:45) [10]
> OutboundClient для IdTcpClient

Да, но метод IdTcpClient.IOHadler.CheckForDataOnSource не доступен!

Компидятор пишет - "Undeclared identifier CheckForDataOnSource"


Eraser   (2009-03-02 13:45:00) [6]

> OutboundClient для IdTcpClient

OutboundClient это и есть TIdTcpClient.


Eraser   (2009-03-02 13:44:00) [7]

> [4] Alik   (02.03.09 11:33)


> А где находится методы

в IOHandler.


Сергей М.   (2009-03-02 13:00:00) [8]


> Можно ли как то кастрировать это сообщение?


Можно.
Заключи жертву кастрации в блок try..except


Alik   (2009-03-02 12:38:00) [9]

> Сергей М.

А может ли вообще Client узнать, что у него пришли данные во входящий регистр не вызывая функций чтения Readln и др., которые в случае отсутствия данных вываливают сообщение о таймауте.

Можно ли как то кастрировать это сообщение? нету данных ну и работай в нормальном режиме дальше без предупреждений!


Сергей М.   (2009-03-02 12:07:00) [10]


> Alik   (02.03.09 11:35) [5]



> а нужно для Сlient


А какого же лешего тогда упоминаешь


> В TIdTCPServerесть такая обработка - OnExecute


?


Alik   (2009-03-02 11:35:00) [11]


> Сергей М. ©   (01.03.09 17:33) [2]
> http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=TIdTCPServer_OnExecute.
> html


По данной ссылке нашел инфу по IdTCPServer, а нужно для Сlient!


Alik   (2009-03-02 11:33:00) [12]

> Eraser ©   (01.03.09 17:39) [3]

IOHandler.CheckForDataOnSource
IOHandler.InputBuffer
      OutboundClient.IOHandler.InputBuffer.ExtractToBytes(bData);
      if Length(bData) > 0 then
      begin
        //
      end;

А где находится методы IOHandler.CheckForDataOnSource, IOHandler.InputBuffer и OutboundClient для IdTcpClient?


Eraser   (2009-03-01 17:39:00) [13]

> [0] Alik   (01.03.09 16:52)


> можно ли узнать есть ли что-нибудь в буфере перед тем как
> вызвать Readln?

IOHandler.CheckForDataOnSource
IOHandler.InputBuffer
       OutboundClient.IOHandler.InputBuffer.ExtractToBytes(bData);
       if Length(bData) > 0 then
       begin
         //
       end;


Сергей М.   (2009-03-01 17:33:00) [14]


> Пробовал например так, в событии Таймера делаю


Убирай таймер совсем.
Он здесь ни с какого боку не нужен.

Читай сюда:


Сергей М.   (2009-03-01 17:33:00) [15]

http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=TIdTCPServer_OnExecute.html


Наверх

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