procedure Delay(msecs:integer); 
var 
FirstTickCount:longint; 
begin 
FirstTickCount:=GetTickCount; 
repeat 
Application.ProcessMessages; 
until ((GetTickCount-FirstTickCount) >= Longint(msecs)); 
end; procedure TForm1.Button4Click(Sender: TObject); 
var 
Params: TStrings; 
t:TStringStream; 
o:string; 
i,k:Integer; 
paralist:TStrings; 
PostURL:String; 
begin 
  try 
  kaiguan:=1; 
while kaiguan>0 do 
  begin 
  idHTTP1:= TidHTTp.create(self); 
  idHTTP1.HandleRedirects := True; 
  Params := TStringList.Create; 
  t:=TStringStream.Create(''); 
idHTTP1.Request.CustomHeaders.Add('Referer: '+edit2.text); 
idHTTP1.Request.CustomHeaders.Add('Accept: '+edit1.text); 
idHTTP1.Request.CustomHeaders.Add('Accept-Encoding: '+edit4.text); 
idHTTP1.Request.CustomHeaders.Add('User-Agent: '+edit5.text); 
IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded'; 
PostURL:=edit7.text; 
IdHTTP1.post(PostURL,Params, t); //提交 
o:=t.DataString; 
o:=UTF8toANSI(o); 
memo1.lines.add(trim(o)); 
IdHTTP1.Request.CustomHeaders.Clear; 
ii:=ii+1; 
label10.Caption:=inttostr(ii); 
IdHTTP1.Free; 
    Params.Free; 
    t.Free; 
    delay(strtoint(edit8.text)); 
 if kaiguan=1 then button4.Click; 
end 
    except 
    on   ex:exception   do 
 begin 
 delay(5000); 
    button4.Click; 
    end 
 end; 
  end; procedure TForm1.memo1Change(Sender: TObject); 
begin 
if memo1.Lines.Count>50 then memo1.Lines.Delete(0); 
end; 运行有几个小时后出现stack overflow错误窗口,然后自动退出了。实在是找不出错误所在,请教高手一下,谢谢! 

解决方案 »

  1.   

      idHTTP1:= TidHTTp.create(self); 
      Params := TStringList.Create; 
      t:=TStringStream.Create(''); 
      try
        .......
      finally
        idHTTP1.free;
        Params.free;
        t.free;
      end;
      

  2.   

    while kaiguan>0 do ,kaiguan始终大于零,导致死循环
      

  3.   

    我有另一个“停止”按钮,点击就是kaiguan=0 使之停止下来的。zxf_feng 的意思是不是
        IdHTTP1.Free; 
        Params.Free; 
        t.Free; 
    在循环里面释放会溢出啊?如果我放在循环外再释放,循环次数多了会不会有影响?
      

  4.   


    // 對象的建立與釋放這樣來做。
    try
    Finallyend;
    kaiguan   這個值的變化你是在IDHTTP下如何寫的??
      

  5.   


    不是釋放多了影響,堆上分配了回收了就可以,但頻繁不是好的方法。
    而是 IDHTTP 這樣的POST,異常的次數太高了,這些對象的FREE你應該加在FINALLY裏
      

  6.   

    那我是不是应该循环几次就FREE一次呢?
      

  7.   


     建立了就讓他正常的釋放,你上面的代碼,在POST後,如果出錯。就不能正常釋放了。
      

  8.   

    那我是用  except里面的on  ex:exception  do 之后FREE进行异常处理还是不用except,改用FINALLY 然后IdHTTP1.Free; 呢?
      

  9.   

    try
      try
      finally
      end;
    Except
    end;
     嵌套下不矛盾的。不過這點真不如C,JAVA做得好。