-
Добрый день,
Столкнулся с проблемой создания обработчика поступления данных для INDY компоненты TIdTCPClient. В TIdTCPServer есть такая обработка - OnExecute.
Пробовал например так, в событии Таймера делаю
TIdTCPClient.Readln, работает, но когда буффер пустой появляется исключение. Как блокировать это исключение или
можно ли узнать есть ли что-нибудь в буфере перед тем как вызвать Readln?
-
> Пробовал например так, в событии Таймера делаю
Убирай таймер совсем.
Он здесь ни с какого боку не нужен.
Читай сюда:
-
-
> [0] Alik (01.03.09 16:52)
> можно ли узнать есть ли что-нибудь в буфере перед тем как
> вызвать Readln?
IOHandler.CheckForDataOnSource
IOHandler.InputBuffer
OutboundClient.IOHandler.InputBuffer.ExtractToBytes(bData);
if Length(bData) > 0 then
begin
end;
-
> 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?
-
-
> Alik (02.03.09 11:35) [5]
> а нужно для Сlient
А какого же лешего тогда упоминаешь
> В TIdTCPServer есть такая обработка - OnExecute
?
-
> Сергей М.
А может ли вообще Client узнать, что у него пришли данные во входящий регистр не вызывая функций чтения Readln и др., которые в случае отсутствия данных вываливают сообщение о таймауте.
Можно ли как то кастрировать это сообщение? нету данных ну и работай в нормальном режиме дальше без предупреждений!
-
> Можно ли как то кастрировать это сообщение?
Можно.
Заключи жертву кастрации в блок try..except
-
> [4] Alik (02.03.09 11:33)
> А где находится методы
в IOHandler.
-
> OutboundClient для IdTcpClient
OutboundClient это и есть TIdTcpClient.
-
Eraser © (02.03.09 13:45) [10]
> OutboundClient для IdTcpClient
Да, но метод IdTcpClient.IOHadler.CheckForDataOnSource не доступен!
Компидятор пишет - "Undeclared identifier CheckForDataOnSource"
-
> [11] Alik (02.03.09 17:11)
возможно у тебя более старая версия Indy. вот исходник этой функции
function TIdIOHandler.CheckForDataOnSource(ATimeout: Integer = 0): Boolean;
begin
Result := False;
if Connected then begin
Result := ReadFromSource(False, ATimeout, False) > 0;
end;
end;
-
> Eraser © (02.03.09 19:08) [12]
Удивительно, но осутствует даже метод IDTCPCLient1.IOHandler.ReadFromSource !
Видимо я капитально отстал от жизни (
А можно где скачать free обновленные компонентки?
-
> [13] Alik (02.03.09 20:26)
можно скачать Делфи 2009 )
-
> Alik (02.03.09 12:38) [7]
> А может ли вообще Client узнать, что у него пришли данные
> во входящий регистр не вызывая функций чтения Readln и др.
> , которые в случае отсутствия данных вываливают сообщение
> о таймауте.
Не может, инди - это синхронные блокирующие сокеты, они вообще не вписываются в событийную модель Windows.