IdHTTP1.Get の未応答


momomo  2005-08-02 21:02:26  No: 16788

フォームに貼り付けIdHTTP1

ループ開始
  URL := 'ここに代入';
  s := IdHTTP1.Get(URL);
  //処理
ループ終了


ループ開始
  URL := 'ここに代入';
  MyIdHTTP := TIdHTTP.Create;
   try
    MyIdHTTP.CookieManager := IdCookieManager1;
    s := MyIdHTTP.Get(URL);
  finally
    MyIdHTTP.free;
  end;
  //処理
ループ終了

なぜか
①だと何百回かループすると  応答しなくなります。
(2,3回ループでとまることもあります。)

仕方がないので
実行時に
MyIdHTTP.CookieManager := IdCookieManager1;
みたいな感じで②で  アクセスしています。

①でうまくうごく方法があれば
よろしくお願いします


はてな  2005-08-03 03:49:37  No: 16789

①で1000回ループさせても「応答しなくなる」ことはないけど...

※ 途中で SocketError #10060 Timeout が発生することはあっても、
  以下のように強引に再開(^^ゞすれば問題なく1000回終了。

  i := 0;
  while i < 1000 do begin
    URL := 'http://www.google.com/';
    try
      s := IdHTTP1.Get(URL);
      Application.ProcessMessages; Sleep(10);
      if Application.Terminated then exit;
    except
      continue;
    end;
    RichEdit1.Clear;
    RichEdit1.Text := s;
    inc(i);
  end;


momomo  2005-08-03 09:25:49  No: 16790

はてな さん  こんばんは。

同じURLではありません。
URLは毎回かわります。
ソケットエラーではありません。

②で毎回  作ってアクセスさせると起きないので
個人的には、indyのメモリ管理のバグかなと思うのですが
よくわかりません。

書き忘れましたが、未応答とは別に
①だと  ときどきIdHTTPのどこかでメモリ違反がおきることもあります。
  (indy内のTMemoryStream関係でおきていました。)
  追跡しましたがindyの細部のソース理解していないのでよくわかりません。
②だと同じコードなのにおきません。

また  未応答にはいったときは、(完全にソフトの応答がなくなります)
ストップをかけると CPUビューになり
nt.dllなんとかでとまります。

①でやりたいのですが  とまるので

①の
s := IdHTTP1.Get(URL);
をコメントにして
②に置き換えて
処理させています。

とりあえず②で正常に動くので
②で、しのいでいます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加