フォームに貼り付け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;
みたいな感じで②で アクセスしています。
①でうまくうごく方法があれば
よろしくお願いします
①で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;
はてな さん こんばんは。
同じURLではありません。
URLは毎回かわります。
ソケットエラーではありません。
②で毎回 作ってアクセスさせると起きないので
個人的には、indyのメモリ管理のバグかなと思うのですが
よくわかりません。
書き忘れましたが、未応答とは別に
①だと ときどきIdHTTPのどこかでメモリ違反がおきることもあります。
(indy内のTMemoryStream関係でおきていました。)
追跡しましたがindyの細部のソース理解していないのでよくわかりません。
②だと同じコードなのにおきません。
また 未応答にはいったときは、(完全にソフトの応答がなくなります)
ストップをかけると CPUビューになり
nt.dllなんとかでとまります。
①でやりたいのですが とまるので
①の
s := IdHTTP1.Get(URL);
をコメントにして
②に置き換えて
処理させています。
とりあえず②で正常に動くので
②で、しのいでいます。
ツイート | ![]() |