0

私はDelphiでURLをチェックしてそれらが稼働しているかどうかを確認するプログラムを作成しています。問題は、一部の Web サイトではこのアクションに少し時間がかかることです。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

上記は、私がよく使用するタイムアウト値です。ただし、より低い値を使用して、Web サイトの応答が遅い場合に通知することもできます。

いずれかのタイムアウトを超えると、HTTP コンポーネントは例外を発生させます。

code将来のコード変更で問題が発生しないように、forループ内で初期化することを検討してください。ただし、現状では問題ありません。

また、リスト内の各ホスト名に自動的に追加www.しないことを検討してください。代わりに、ホスト名に必要な場合はwww.、リストに追加してください。実際には、両方をテストしたい場合があります。多くの場合、一方が他方にリダイレクトされるだけですが、どちらかが機能していない場合、顧客を失う可能性があります。

コメントで提案されているように、UI の応答性を維持するために、これをメイン スレッドとは別のスレッドで実行することが理想的です。

于 2013-10-09T18:30:52.800 に答える