2010-07-23 133 views
7

我已经使用Indy TIdhttp组件构建了一个简单的网站监视应用程序。我想检测指定页面在指定时间范围内没有返回(我正在使用5000毫秒)。作为一项测试,我在一个网站上创建了一个页面,故意花费15秒的时间做出回应。但是我无法让我的程序在5秒后“放弃”。我一直在使用一个定时器和OnWorkBegin事件试图ReadTimeout,一个suggested solution(从来没有能够得到OnWorkBegin到get调用后立即开火)。有没有办法为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)。 – 2010-07-23 04:41:45

+2

你的逻辑与TTimer预计异步TIdHTTP这是不正确 – 2010-07-23 07:54:15

+0

看了罗布肯尼迪建议的文章。我创建了一个线程类型的解决方案。在主应用程序中创建一个TStringList来管理我的线程。我也有一个计时器,每5秒触发一次。所以如果我看到一个线程在5秒钟内没有“完成”,我就调用线程的Terminate方法。但是这似乎并不像我想要的那样立即“终止”它;它似乎仍然在等待。 – 2010-07-23 16:10:56

回答

2

我最终根据Rob Kennedy的评论得出了答案。我多次尝试与他联系并要求他作出“正式”的回答,以便我可以给他投票。从未听过。

相关问题