2010-07-23 4 views
7

Indy TIdhttp 구성 요소를 사용하여 간단한 웹 사이트 모니터링 응용 프로그램을 만들었습니다. 지정된 페이지가 지정된 시간 프레임 내에 반환되지 않은 경우 (5000 밀리 초 사용 중) 감지하고 싶습니다. 테스트로서 나는 의도적으로 응답하는데 15 초가 걸린 웹 사이트에 페이지를 만들었습니다. 그러나 5 초 후에 내 시술을 "포기"할 수는 없습니다. 내가 타이머와 OnWorkBegin 이벤트를 사용 에게 ReadTimeout하는 suggested solution을 시도합니다 (GET 호출 후 즉시 해고 OnWorkBegin을 얻을 수 없었어).Indy Tidhttp에 대한 응답 시간 제한을 설정하는 방법이 있습니까?

참고 연결 시간 제한에 대해 걱정하지 않습니다. 내 관심사는 서버가 페이지를 반환하는 시간 초과입니다.

다음은 내가 사용 해본 일부 소스 코드입니다. 여기에는 내가 참조하는 많은 요소가 포함되어 있습니다.

procedure TServLogic.WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); 
begin 
    GetTimer.Enabled := True; 
end; 
procedure TServLogic.WorkEnd(ASender: TObject; AWorkMode: TWorkMode); 
begin 
    GetTimer.Enabled := False; 
end; 

procedure TServLogic.GetTimerTimer(Sender: TObject); 
begin 
    idHttp.Disconnect(True); 
end; 

procedure TServLogic.CallHttp(mlink: String): String; 
begin 
    result := ''; 
    GetTimer := TTimer.create(nil); 
    GetTimer.OnTimer := GetTimerTimer; 
    GetTimer.Interval := 5000; 
    try 
    IdHTTP := TIdHTTP.create(nil); 
    idhttp.ReadTimeout := 5000; 
    IdHttp.OnWorkBegin := WorkBegin; 
    IdHttp.OnWorkEnd := WorkEnd; 
    try 
     result := idhttp.get(mLink); 
    except 
     on e:exception do begin 
     AppendToLog('Server did not respond withing 5 seconds'); 
     end; 
    end; 
    finally 
    GetTimer.Free; 
    idhttp.free; 
    end; 
end; 
+0

참고 사항 : [Indy를 사용하는 동안 연결이 시간 초과되지 않습니다.] (http://stackoverflow.com/questions/3187446/the-connection-does-not-timeout-while-using-indy). –

+2

TTimer를 사용하는 논리가 비동기식 TIdHTTP를 예상합니다. –

+0

Rob Kennedy가 제안한 기사를 살펴 보았습니다. 스레드 유형 솔루션을 만들었습니다. 내 스레드를 관리하기 위해 주 응용 프로그램에 TStringList를 만들었습니다. 나는 또한 5 초마다 발사하는 타이머를 가지고있다. 따라서 5 초 내에 "완료"되지 않은 스레드가 표시되면 스레드의 Terminate 메서드를 호출합니다. 그러나 이것은 내가 원하는대로 즉시 "종결"하는 것처럼 보이지 않습니다. 여전히 기다리고있는 것 같습니다. –

답변

2

나는 롭 케네디 (Rob Kennedy)의 의견에 근거하여 결국 대답을 얻었다. 나는 그에게 연락을 취하기 위해 여러 번 시도해 보았고 그가 그에게 투표를 할 수 있도록 "공식적인"대답을 요청했다. 결코 들리지 않았다.

관련 문제