我在另一线程中,动态生成一个TBitmap
对其操作,
  tmpBMP: TBitmap := TBitmap.Create;
  .....
  tmpBMP.free;
  tmpBMP := nil;为什么最后GDI对象越来越多,是不是没得到释放

解决方案 »

  1.   

    我也有这种问题,怎么看 GDI对象越来越多?
      

  2.   

    怎么看 GDI对象越来越多?在进程管理器中就有啊!  tmpBMP: TBitmap := TBitmap.Create;
      .....//可能问题在这里//
      tmpBMP.free;
      tmpBMP := nil;
      

  3.   

    你自己设定一个线程OnTerminate事件,在事件里释放一些资源,那当线程结束以后就会执行,释放这些资源。
      

  4.   

    GDI对象主要是指Tcanvas对象的实力,你需要考虑的是是不是你在什么地方建立的TCANVAS的对象实力而没有释放。
      

  5.   

    我的错误出在 BMP.SaveToStream 这一句上, Create,Free Canvas都没有问题。使用的是 TMemoryStream
      

  6.   

    是不是会有多线程同步的问题.你多个线程如果用的是同一个BITMAP最好你做个锁保护下.
      

  7.   

    tmpBMP: TBitmap := TBitmap.Create;
      .....
      tmpBMP.free;
      tmpBMP := nil;
    这些代码放在进程外面,里面只是调用就行了
      

  8.   

    tmpBMP: TBitmap := TBitmap.Create;
      try
        .....
      finally
       tmpBMP.free;
       tmpBMP := nil;
      end;这样可以保证即使中间的操作出现异常还可以正确释放资源
      

  9.   

    不一定是泄漏了,delphi里面好些具有相同属性的gdi资源都是共享的,使用引用计数来管理,所以,当其他对象使用了相同属性的gdi资源时,即使你这边释放,也不会减少gdi句并的总数。
      

  10.   

    我的问题解决了,方法是,从生成Bitmap到使用,Tcanvas的使用,最后释放,都是用API实现。使用后就释放,没问题的。
      

  11.   

    不是 TBitmap的生成问题,而是 对Delphi的这些对象(TCanvas)操作都有问题。
    简单的Canvas.Pixel[0, 0] := clBlack; 这都会增加一个GDI计数。
      

  12.   

    我的问题是,我用任务管理器看了,GDI并没有增多。
      

  13.   

    就是把对TCanva的对象操作,放在线程里才会出现问题。放在主线程不会有什么问题的。
    代码:线程1的执行代码:
       Canvas.Pixel[0, 0] := clBlack;