我程序最近很不稳定。老是执行一会就自动关闭掉。后来调试了一个晚上找到了原来是堆溢出。但是仔细一看的时候
溢出的地方仅仅是一个变量名,不知道何解。百度过几次。有的人说是不断循环赋值而造成的错误(而我的
这个函数正好就是多个线程同时运行时必要调用到的函数),不知道是不是因为这样而造成溢出的。望各位
老大能给个解释!!该怎么解决这样的问题呀

解决方案 »

  1.   

    估计是使用线程不安全对象,你加个同步处理,还有可能你创建线程用的API CreateThread而不是BeginThread去创建的线程
    ,在DELPHI里使用BeginThread函数去创建线程,虽然最终调用的还是API CreateThread,但是BeginThread里加入了 IsMultiThread参数,DELPHI通过此变量来了解进程中何时有多个线程在运行,只有知道了。它才会保护其内部结构
      

  2.   

     不好意思各位。因为刚下班所以赶紧回来看一下贴发现有这么多热心的朋友真的很感谢。下面是小弟程序中的错误的函数块。现在贴出来大家帮忙看看该如何解决这样的问题function RegexaAllA100(memostr,Rextop:string;RextopI:Integer;Rexup:string; RexupI:Integer;Listview:TListView;listbox:string;CountI:Integer):string;//返回seo内容中的地址
    var  //如: RegexaAlla(内容,头部,        进或退值,         尾部         进或退值       listview     条数 )
      i,e:Integer;
      url,Surl:string;
    begin
      for i:=0 to CountI do //有时循环一百次。有时十次。有时三十次。看得到的内容
      begin
        Delete(memostr,1,Pos(Rextop,memostr)+RextopI+length(Rexup)+RexupI);
        Surl:=Copy(memostr,1,Pos(Rexup,memostr)-1);
        Delete(Surl,Pos('?',Surl),100);
        e:=pos('http://',Surl);       //下面是得到地址xx.com    而listviewcaption和ListviewCaptiona是一个全局变量  
        if (e>=1) and (e<20) and (Pos(Hostdz(Surl,2),ListviewCaption+ListviewCaptiona)<1)
            and (BoxCheckurl(Surl,listbox))then
        begin
          try  //不知道为什么在url赋值时出错。有时出错有时不出错。很难捕捉
            url:=url+surl+#13#10;          //还会自动判断有没有重复值  有时这里会出现Access violation at address
          except
                //错误后处理的函数位置      
          end;
          surl:=Hostdz(Surl,2);
          try  //将得到的地址http://www.xx.com分割成xx.com  然后赋给全局变量ListviewCaptiona 经常出现下面的错误
             ListviewCaptiona:=ListviewCaptiona+surl+'|';  //将以前搜索过的值储存起来。  有时这里会出现Access violation at address
          except
             //错误后处理的函数位置   
          end;
        end;
      end;
      result:=url;
    end;
      

  3.   

    string是不是widestring?超长了?
      

  4.   

    多线程下用个同步函数,处理下面这句
      ListviewCaptiona:=ListviewCaptiona+surl+'|'; 
      

  5.   

    注意线程参数中Listview需要是新创建的TListView。不要使用共同的。
    另外看你函数中并不需要使用tlistview这样的组件作为参数。只需要返回一个字符串作为caption就可以了
      

  6.   

    ListView参数未使用。Hostdz  这是啥
    BoxCheckurl 这是啥
      

  7.   

    第一句加个url:=''试试?
    另外多个线程处理的时候,memostr有没有可能同时传同一个字符串?