Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > IdHTTP


Автор: slavonX86 12.3.2006, 19:00
Я захожу на саит. Идёт переадресация. Пишет: connecting to x.x.x.x.
Как зделать чтобы например через 60 сек (если не идёт загрузка) прерывалось получение документа.

Автор: Guedda 12.3.2006, 23:10
Ставь таймер на 60 секунд и учись задавать вопросы.

Автор: slavonX86 13.3.2006, 09:34
Есть компонент на форме IdHTTP1.

Я пишу запрос:
Код

IdHTTP1.Get('www.xxxxxxxx.ru');


В обработчике событий IdHTTP1Status переменная AStatusText: string принимает значение 'connecting to x.x.x.x'.

И на этом этапе остаётся программа !!!

Вопрос: как зделать стоп для этого запроса по истечению 60 сек ???

Автор: Romikgy 13.3.2006, 11:36
Запускай таймер в
Цитата(slavonX86 @ 13.3.2006, 08:34 Найти цитируемый пост)
обработчике событий IdHTTP1Status

на 60 сек, при
Цитата(slavonX86 @ 13.3.2006, 08:34 Найти цитируемый пост)
'connecting to x.x.x.x'.

если таймер щелкул, делай дисконект

Автор: Snowy 13.3.2006, 11:52
Работу с http нужно вынести в отдельный thread.

Автор: slavonX86 13.3.2006, 15:07
Цитата(Snowy @ 13.3.2006, 11:52)
Работу с http нужно вынести в отдельный thread.

Я вынес в отдельный поток.
Добавлено @ 15:14
Пробовал:
Код

  IdHTTP1.ConnectTimeout := 60000;
  IdHTTP1.ReadTimeout := 60000;


не помогает.


P.S. > Оно подключается (т.е. подключение произошло и IdHTTP1.ConnectTimeout не катит), затем происходит преадресация. А IdHTTP1.ReadTimeout это вроди чтение данных из стека (т.е. тоже не подходит).

Автор: Snowy 13.3.2006, 15:47
Цитата(slavonX86 @ 13.3.2006, 15:07 Найти цитируемый пост)
Я вынес в отдельный поток.
Ну так убей его через TerminateThread

Автор: Демо 13.3.2006, 23:17
Цитата(slavonX86 @ 13.3.2006, 15:07 Найти цитируемый пост)
ReadTimeout это вроди чтение данных из стека (т.е. тоже не подходит).


ReadTimeout как раз подходит. Это время, в течение которого сервер должен вернуть ответ.
ConnectTimeOut - время на подключение.
Добавлено @ 23:24
Простейший пример:

Код

unit uHTTPThread;

interface

uses
  classes,IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP;

type

  THTTPThreadComplete=procedure(const Result: String);

  THTTPThread=class(TThread)
  private
    FH: TIdHTTP;
    FQuery: String;
    FResult: String;
    FOnComplete: THTTPThreadComplete;
    procedure Complete;
  protected
    procedure Execute; override;
  public
    constructor Create(const Query: String; CompleteProc: THTTPThreadComplete);
  end;


implementation

{ THTTPThread }

procedure THTTPThread.Complete;
begin
  if Assigned(FOnComplete) then FOnComplete(FResult);
end;

constructor THTTPThread.Create(const Query: String;
  CompleteProc: THTTPThreadComplete);
begin
  inherited Create(True);
  FreeOnTerminate := True;
  FQuery := Query;
  FOnComplete := CompleteProc;
  FResult := '';
  Resume;
end;

procedure THTTPThread.Execute;
begin
  FH := TIdHTTP.Create(nil);
  FH.HandleRedirects := True;
[B]  FH.ReadTimeout := 10000;
  FH.ConnectTimeout := 10000;
[/B]  try
    try
      FResult := FH.Get(FQuery);
    except
    end;
  finally
    FH.Free;
  end;
  Synchronize(Complete);
end;

end.



И все прекрасно срабатывает.

Автор: slavonX86 24.4.2006, 19:38
ReadTimeout := 10000;    
ConnectTimeout := 10000;

А как тут время считается ?
-----------------------------------
ReadTimeout := 100000;    
ConnectTimeout := 10000;

Через 30 сек происходит
----------------------------------
ReadTimeout := 10000;    
ConnectTimeout := 10000;

Через 20 сек происходит
-----------------------------------
 

P.S. >> работаю через прокси
IDHTP1.Proxy..... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)