一个报表程序,使用ADO控件和fastreport控件,在运行的时候程序占用内存达到11兆左右,而且在运行的时候越来越大。后面的原因可能是我在程序运行中没有释放窗体,但是应该怎么写代码来释放,代码写在哪里?还有怎么让程序初始的时候占用内存更小?

解决方案 »

  1.   

    帮你up,把你动态创建的那些form组件注意一下
      

  2.   

    1。使用VirtualLock()和VirtualUnlock()这两个API函数。VirtualLock函数可以将申请的一段虚拟内存锁死在物理内存中,这样,在任何情况下操作系统也不会将这段虚拟内存叶面调回硬盘中。因此如果程序分配的某一段内存对程序的运行非常重要,不希望操作系统在繁忙的情况下将它移动到硬盘上,就可以使用VirtualLock将这段内存锁死在物理内存中。用完这段内存后,记住一定要用VirutalUnlock函数。VirtualUnlock韩书会告诉操作系统对刚才锁死的内存进行解锁,即操作系统在需要的时候可以将这段内存交换到硬盘中。
    2。使用SetProcessWorkingSetSize(-1,-1)函数,当应用程序空闲时,或者不再使用工作集。。打得累死了,就写这么多吧这上面的文字是《软件开发的科学和艺术》里面的,你可以看看。释放内存还有一个方法:最小化,恢复。
      

  3.   

    还有一种可能就是你的ado占用了内存,你可以控制释放ado所占用的内存。
      

  4.   

    ado确实占了很多内存,但是我却不知道怎么释放,每次打开一个表之后再关掉却看不到使用内存的减少,close好像是不管用的。如果哪位达人知道怎么处理,请给出详细的代码。还有上面提到的动态创建窗体并释放,也希望能有具体的代码给看看,多谢!
      

  5.   

    Form1 :=TForm1.Create(Nil) ;
    try
      Form1.ShowModal ;
    finally
      Form1.Free ;
    end ;或者
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action :=caFree ;
    end ;
      

  6.   

    按白水兄的方法,报错说已经存在同名的对象,请问在程序初始化的时候应该怎么样做,难道把application中的Tform1Create()语句删掉吗?请给出动态创建窗体和释放窗体的全过程。多谢!!
      

  7.   

    先判断,
    如不存在就Create
    存在的话就
    输为NIL
      

  8.   

    licese:
      Nil仅仅是空指针而已,他并不代表着资源的释放。对于窗体而言如:frmLogin.free才代表了资源的释放。我想提的问题是:在三层结构中客户端如何的释放客户端指针,如何让服务器立即释放该指针所指向的实例
      

  9.   


    一切对象皆指针!free只是清空了内存空间,nil才是清空指针
      

  10.   

    在窗体的OnClose事件中写:
    action:=cafree;
    在窗体的OnDestoy事件中写:
    from:=nil;ADO组件释放内存使用Free方法。