窗体中有一个treeview控件,其中数据比较多,有2000条左右,且都分配了指针,也就是node.data都分配了。
现在的问题是:
在form的destroy事件中,已经将treeview的指针都释放掉了,但窗台关闭后,有一段时间cpu 占用达到100%。原来treeview数据较少时,没有这个问题,求教各位高手,该如何处理????

解决方案 »

  1.   

    这个我+在窗体的关闭按钮事件中了,我试了一下,加在destroy事件中,效果也一样。
    for I := 0 to tv1.Items.Count - 1 do
        if Assigned(tv1.items.item[I].Data) then
           Dispose(tv1.items.item[I].Data);
      

  2.   

    for i:=tv1.Items.count-1 downto 0 do
    begin
      if tv1.items.item[I].Data <> nil then
        Dispose(tv1.items.item[I].Data);
    end;
      

  3.   

    我放在关闭按钮的click事件中,应该效果一样吧,现在还是100%
      

  4.   

    你断点调试一下,看看执行到哪里出现cpu高涨,不一定是这里的问题
      

  5.   

    放在destroy事件中也一样,还是100%
      

  6.   

    看看程序关闭进程销毁了没有?是那个进程占cpu
      

  7.   

    我试过了,destory事件过去了,也没事,就是在窗体关闭后,才会出现这个问题。问题是,以前数据少时没有问题,以前只有几百条数据,没有发生过这种情况
      

  8.   

       我的项目:project1.exe
     
       我在里面的窗体是在pagecontrol上打开的,在窗体关闭时,承载窗体的pagecontrol页面也同时关闭,以前数据少时可以同时关闭,现在数据多了,就出现窗体关闭了,然后cpu100%,过几十秒,pagecontrol才能关闭。   任务管理器中也显示,project1.exe占用cpu98%。
      
      

  9.   

    应该是你的机器在作1--2000的循环的时候占用了cpu
      

  10.   

    我把这个循环放在窗体的close事件前面了,就是怕循环太多。可是现在close已经过了,窗体已经关闭了,然后cpu才100%
      

  11.   

    我有三棵树,其中有一棵树有6000多条数据,刚才测试了一下,也没有你所述的问题,估计是树销毁时引发了其他什么事件,比如 树节点的OnChange,可以在树销毁前,加入以下等代码:  tv1.OnChange := nil;
      for I := 0 to tv1.Items.Count - 1 do
        if Assigned(tv1.items.item[I].Data) then
           Dispose(tv1.items.item[I].Data);其次,你的Dispose(tv1.items.item[I].Data);代码存在隐患,操作系统可能不知道释放多少内存,因为Dispose地时候,不知道要释放的大小。应该如此:Dispose(PMyData(tv1.items.item[I].Data));其中,PMyData是存储在Data域的记录结构。PMyData = ^TMyData;
              TMyData=record
                 ....
              end;
      

  12.   

    哦,我里面确实有onchange事件,我现试试看
      

  13.   

    PMyData1=^TMyData1;
      TMyData1=Record
        myid:integer;
      end;var myrec:pmydata1;树中每个node建立时,都是用new(myrec),给node的data
      

  14.   

    A:为什么窗体已经关闭了(看不到了),才开始100%的占用?
    Q:会不会是内存处理回收?修改以下代码试试看:
    Dispose(tv1.items.item[I].Data);-->Dispose(PMyData1(tv1.items.item[I].Data)); 
      

  15.   

    现在的:还是不行:
    procedure TForm_rxfc.FormDestroy(Sender: TObject);
    var i:integer;
    begin
             tv1.OnChange := nil;
             for I := 0 to tv1.Items.Count - 1 do
                 if Assigned(tv1.items.item[I].Data) then
                    Dispose(Pmydata1(tv1.items.item[I].Data));
    end;
      

  16.   

    会不会是我们的思考的方向错拉!,cpu高涨先确定是不是这个TV引起的?,把这一段独立出来写一下,看还会cpuhui 涨起来不?
      

  17.   

    procedure TForm_rxfc.FormDestroy(Sender: TObject); 
    var i:integer; 
    begin 
             tv1.OnChange := nil; 
             for I := 0 to tv1.Items.Count - 1 do 
             begin
                 if Assigned(tv1.items.item[I].Data) then 
                    Dispose(Pmydata1(tv1.items.item[I].Data));
                 Application.Progress;
             end;        
    end;