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;
另请参见:[使用Indy时连接不超时](http://stackoverflow.com/questions/3187446/the-connection-does-not-timeout-while-using-indy)。 – 2010-07-23 04:41:45
你的逻辑与TTimer预计异步TIdHTTP这是不正确 – 2010-07-23 07:54:15
看了罗布肯尼迪建议的文章。我创建了一个线程类型的解决方案。在主应用程序中创建一个TStringList来管理我的线程。我也有一个计时器,每5秒触发一次。所以如果我看到一个线程在5秒钟内没有“完成”,我就调用线程的Terminate方法。但是这似乎并不像我想要的那样立即“终止”它;它似乎仍然在等待。 – 2010-07-23 16:10:56