在delphi中有没有办法使用计时器来中断非递归代码

在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

我正在用Delphi做一个程序,检查URL是否正常。问题是,在某些网站上,这一行动可能需要一些时间。我希望它在大约10秒钟后放弃。我的问题是,有没有办法在一段时间后停止检查并转到列表中要检查的下一项

更新 抱歉没有输入密码。仍在努力确定需要多少代码,而不是问题

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,你说得对,我的脑子里充满了丢失的“捕获所有”错误处理程序。我更新了答案。