0

我正在 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 秒后停止尝试

4

1 回答 1

4

只需在创建 HTTP 组件后设置超时:

http := TIdHTTP.Create(nil);
http.ReadTimeout := 30000; // 30 seconds
http.ConnectTimeout := 10000; // 10 seconds

以上是我经常使用的超时值。不过,您可能希望使用较低的值,并且如果网站响应缓慢,也会收到通知。

如果超过任一超时,HTTP 组件将引发异常。

code考虑在您的循环中进行初始化,for以使自己免受未来代码更改的困扰,尽管就目前而言,这很好。

此外,请考虑不要自动添加www.到列表中的每个主机名。相反,如果您的主机名需要www.其中,请将其添加到列表中。事实上,您可能希望同时测试两者。很多时候,一个只是重定向到另一个,但如果其中一个不起作用,您就有可能失去客户。

正如评论中所建议的那样,最好在与主线程不同的线程中运行它以保持 UI 响应。

于 2013-10-09T18:30:52.800 回答