Перейти к содержанию
Fire Monkey от А до Я
  • 0

[TidHTTP] Не срабатывает Timeout


brunnengi

Вопрос

Здравствуйте.

В приложение под Android нажимаю на кнопку SEND и идет запрос в отдельном потоке.

В потоке idHTTP использую timeout в 59000.

var
  http : TIdHTTP;
  st: TStringList;
begin
  http := TIdHTTP.Create();

  http.ReadTimeout    := 59000;
  http.ConnectTimeout := 59000;
  
  sResponse :=  http.Get('http://somesite.ru/somescript.php?date='+rDate);

  http.Free;
  Synchronize(Sync);
end;

Но если качество интернета плохое, или если интернет был, а потом исчез, или если просто сервер долго не отвечает, то timeout почему то не срабатывает.

Может я что то не правильно делаю и надо как то по другому timeout выставлять? Подскажите плз.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Я обычно делаю пинг icmp сначала с небольшим таймаутом в несколько секунд, в случае доступности уже idhttp с таймаутом побольше секунд 15 - в зависимости от вызываемого на сервере содержимого. 59с имхо это борщ

Ссылка на комментарий
  • 0

UP. Использую IdHHTP, ставлю любые значения connectTimeOut, и ReadTimeout, но в итоге до появления ислкючения проходит совершенно хаотично время, то 10 секунд, то 22, а то 48, а то раз и 1 секунда, все это на один и то-тот же запрос. Как такое расценивать я даже не знаю.

Такое ощущение что Indy эти таймеры глубоко побоку. Но чем то же это должно объясняться. Может кто вышел из положения, подскажите пожалуйста.

Проверяю так. Отключая на роутере инет, мобильный подключен по WiFi, достучаться до сайта естественно не может, но откуда разные таймауты берутся вообще не понятно...

 

Delphi XE7.1.

Ссылка на комментарий
  • 0

Именно с "EIdException" у меня работает вменяемо. Как вариант можно сделать так:

type
  TForm1 = class(TForm)
    procedure Button1Click(Sender: TObject);
  private
    MyFlag : Boolean;
  public
   
  end;
  
  
 ...
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
	TThread.CreateAnonymousThread(nil, procedure() 
	var
		IdHTTP1 : TIdHTTP;
	begin
		IdHTTP1 := TIdHTTP.Create(nil);
		form1.MyFlag := false;
		IdHTTP1.Get('http://lenta.ru');
		form1.MyFlag := true;
		IdHTTP1.free;
	end).start;
	
	// Ну и тут запустить таймер, который проверит через нужное вам время переменную MyFlag
end;
Ссылка на комментарий
  • 0

 

Именно с "EIdException" у меня работает вменяемо.

Невероятно, но так действительно сработало!  Правда не совсем так как предполагалось, но теперь ексепшн появляется гораздо быстрее чем установленный таймаут, но это как раз то, что нужно.

Спасибо большое еще раз, сам бы не точно не догадался. ))

Ссылка на комментарий
  • 0

Помнится я целый день на гугл потратил в поисках этого...

А насчет того что быстрей срабатывает чем установлен таймаут, что-то тут не то, я ради интереса засекал сегодня, отрабатывает четко по таймауту.

Изменено пользователем xenon54
Ссылка на комментарий
  • 0

У меня похожая проблема:

 

У меня есть запрос GET:

IdHTTP1.ConnectTimeout:=5000; 
IdHTTP1.ReadTimeout:=5000; 
try 
  IdHTTP1.Get('http://my1.ru/Update.txt'); 
    connected := True; 
Except 
    connected := false; 
end; 

Я специально имитирую медленное соединение( в роутере ограничиваю скорость до 1 Kbps) . В Windows всё нормально через 5 сек дальше программа выполняется, но в Android виснет(пытается все соединиться, не обращая внимания на таймаут) и запрос даже не доходит до Except. Почему не срабатывает таймаут в Android(причем как я понял именно ReadTimeout) ?

Изменено пользователем yura371
Ссылка на комментарий
  • 0

Выше же написано. Используйте on E : EIdException.

Код до Except(до исключения) вообще не доходит а на GET виснет.

Я пробовал "on E : EIdException" не работает, по ранее указанной причине.

Изменено пользователем yura371
Ссылка на комментарий
  • 0

Честно говоря, я не особо разбирался почему с EIdException выполнение кода заходит в блок исключений, а без нет. Но подозрительно что у всех работает, а у вас нет. Я думаю 8 пост в этой теме намекает на то что это не мои бредни которые я сам придумал, а такова работа инди. Попробуйте на пустом проекте.

 

Вот еще одна возможная причина:

 

 

If you are connecting to a hostname instead of an IP address, the hostname has to be resolved to an IP via a DNS lookup, which can take time, especially if the hostname has not been cached by the OS yet. The ConnectTimeout property does not account for that time.
Изменено пользователем xenon54
Ссылка на комментарий
  • 0

Нашел проблему. Вынес IdHttp в поток, как здесь описано http://fire-monkey.ru/topic/30-fonovoe-vypolnenie-operatcii-bez-zamorazhivani/ и всё заработало. Без таймеров(таймауты оставил) и "On E: EIdException do". Спасибо Вам всем.

Изменено пользователем yura371
Ссылка на комментарий
  • 0

в инди не пашут таймауты которые вы выставляете, при непосредственной работе с сокетами инди (http) использует infinite.

Кстати обнаружил в XE8 какие-то новые http компоненты, может они получше. т.к инди уж очень часто преподносит сюрпризы.  

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...