在delphi中有没有办法使用计时器来中断非递归代码
我正在用Delphi做一个程序,检查URL是否正常。问题是,在某些网站上,这一行动可能需要一些时间。我希望它在大约10秒钟后放弃。我的问题是,有没有办法在一段时间后停止检查并转到列表中要检查的下一项 更新 抱歉没有输入密码。仍在努力确定需要多少代码,而不是问题在delphi中有没有办法使用计时器来中断非递归代码,delphi,timer,non-recursive,Delphi,Timer,Non Recursive,我正在用Delphi做一个程序,检查URL是否正常。问题是,在某些网站上,这一行动可能需要一些时间。我希望它在大约10秒钟后放弃。我的问题是,有没有办法在一段时间后停止检查并转到列表中要检查的下一项 更新 抱歉没有输入密码。仍在努力确定需要多少代码,而不是问题 procedure TWebSiteStatus.Button1Click(Sender: TObject); var http: TIdHTTP; url: string; code: integer; i: integ
procedure TWebSiteStatus.Button1Click(Sender: TObject);
var
http: TIdHTTP;
url: string;
code: integer;
i: integer;
begin
for i := 0 to Memo1.Lines.Count - 1 do
begin
url := 'http://www.' + Memo1.Lines[i];
http := TIdHTTP.Create(nil);
try
try
http.Head(url);
code := http.ResponseCode;
except
on E: EIdSocketError do
begin
code := http.ResponseCode;
end;
on E: EIdHTTPProtocolException do
begin
code := http.ResponseCode;
end;
end;
ShowMessage(IntToStr(code));
Case code of
200:
Edit2.Text := Memo1.Lines[i] + ' website is ok';
301:
Edit2.Text := Memo1.Lines[i] + ' website has moved but works';
else
begin
Edit2.Text := 'Something is wrong with the ' + Memo1.Lines[i] + ' website';
down;
end;
end;
finally
http.Free();
end;
end;
end;
当它在做http.Head(url)时
我如何告诉它在10秒后停止尝试?创建HTTP组件后,只需设置超时:
http := TIdHTTP.Create(nil);
http.ReadTimeout := 30000; // 30 seconds
http.ConnectTimeout := 10000; // 10 seconds
以上是我经常使用的超时值。不过,您可能希望使用较低的值,并且如果网站响应缓慢,也会收到通知
如果超过任一超时,HTTP组件将引发异常
考虑在for
循环中初始化code
,以避免将来的代码更改带来麻烦,尽管目前的情况是这样的
也不要考虑在列表中的每个主机名中自动添加<代码> www>代码>。相反,如果主机名需要
www.
,请将其添加到列表中。事实上,您可能希望测试这两种方法。通常,其中一个只是重定向到另一个,但如果其中任何一个不起作用,您就有可能失去客户
正如评论中所建议的,最好在主线程之外的单独线程中运行此功能,以保持UI的响应性。创建HTTP组件后,只需设置超时:
http := TIdHTTP.Create(nil);
http.ReadTimeout := 30000; // 30 seconds
http.ConnectTimeout := 10000; // 10 seconds
以上是我经常使用的超时值。不过,您可能希望使用较低的值,并且如果网站响应缓慢,也会收到通知
如果超过任一超时,HTTP组件将引发异常
考虑在for
循环中初始化code
,以避免将来的代码更改带来麻烦,尽管目前的情况是这样的
也不要考虑在列表中的每个主机名中自动添加<代码> www>代码>。相反,如果主机名需要
www.
,请将其添加到列表中。事实上,您可能希望测试这两种方法。通常,其中一个只是重定向到另一个,但如果其中任何一个不起作用,您就有可能失去客户
正如评论中所建议的,最好在一个独立于主线程的线程中运行此功能,以保持UI的响应性。您是否使用Indy组件来实现此功能?您是否尝试过设置超时值?例如,
TIdHTTP
具有ConnectTimeout
和ReadTimeout
属性。它是在代码中花费时间,还是在库代码中花费时间。如果是你的代码,定期检查超时,然后退出。请告诉我您是在工作线程上而不是在UI线程上执行此操作的。只要您是,您就可以在控制线程中设置超时。当您达到超时时,终止线程(很好地)并放弃它。您是否为此使用Indy组件?您是否尝试过设置超时值?例如,TIdHTTP
具有ConnectTimeout
和ReadTimeout
属性。它是在代码中花费时间,还是在库代码中花费时间。如果是你的代码,定期检查超时,然后退出。请告诉我您是在工作线程上而不是在UI线程上执行此操作的。只要您是,您就可以在控制线程中设置超时。当达到超时时,终止线程(很好地)并放弃它。不需要初始化code
。在所有读取code
的执行路径中,它将已经在前面的语句中分配。在未分配code
的代码路径中,异常会导致code
在任何人尝试使用它之前超出范围。@RobKennedy,你说得对,我的脑子里充满了丢失的“捕获所有”错误处理程序。我更新了答案。没有必要初始化code
。在所有读取code
的执行路径中,它将已经在前面的语句中分配。在未分配code
的代码路径中,异常会导致code
在任何人尝试使用它之前超出范围。@RobKennedy,你说得对,我的脑子里充满了丢失的“捕获所有”错误处理程序。我更新了答案。