![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработчик прихода данных для 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