多线程与GDI对象释放的问题 我在另一线程中,动态生成一个TBitmap对其操作, tmpBMP: TBitmap := TBitmap.Create; ..... tmpBMP.free; tmpBMP := nil;为什么最后GDI对象越来越多,是不是没得到释放 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我也有这种问题,怎么看 GDI对象越来越多? 怎么看 GDI对象越来越多?在进程管理器中就有啊! tmpBMP: TBitmap := TBitmap.Create; .....//可能问题在这里// tmpBMP.free; tmpBMP := nil; 你自己设定一个线程OnTerminate事件,在事件里释放一些资源,那当线程结束以后就会执行,释放这些资源。 GDI对象主要是指Tcanvas对象的实力,你需要考虑的是是不是你在什么地方建立的TCANVAS的对象实力而没有释放。 我的错误出在 BMP.SaveToStream 这一句上, Create,Free Canvas都没有问题。使用的是 TMemoryStream 是不是会有多线程同步的问题.你多个线程如果用的是同一个BITMAP最好你做个锁保护下. tmpBMP: TBitmap := TBitmap.Create; ..... tmpBMP.free; tmpBMP := nil;这些代码放在进程外面,里面只是调用就行了 tmpBMP: TBitmap := TBitmap.Create; try ..... finally tmpBMP.free; tmpBMP := nil; end;这样可以保证即使中间的操作出现异常还可以正确释放资源 不一定是泄漏了,delphi里面好些具有相同属性的gdi资源都是共享的,使用引用计数来管理,所以,当其他对象使用了相同属性的gdi资源时,即使你这边释放,也不会减少gdi句并的总数。 我的问题解决了,方法是,从生成Bitmap到使用,Tcanvas的使用,最后释放,都是用API实现。使用后就释放,没问题的。 不是 TBitmap的生成问题,而是 对Delphi的这些对象(TCanvas)操作都有问题。简单的Canvas.Pixel[0, 0] := clBlack; 这都会增加一个GDI计数。 我的问题是,我用任务管理器看了,GDI并没有增多。 就是把对TCanva的对象操作,放在线程里才会出现问题。放在主线程不会有什么问题的。代码:线程1的执行代码: Canvas.Pixel[0, 0] := clBlack; stringlist相关的 如何反序列化 收集资料,Delphi在D7以后的版本,在各方面有哪些新技术和改进? 请问如何在DevExpress中的DevExpressVcl控件包中的皮肤控件添置和删除皮肤? 打印明细记录时,每一页的长度都在变,怎样省纸呢?(即每打印完一页要求不走纸!) 单独运行窗体? form创建位置问题 copyfile()中参数要求是pchar,请问如何将string转换过去?我已经无分 ADO问题 请问delphi中有没有替换函数? 我晕....什么错误?SQL.Open未定义? DELPHI 2007 的任务栏右键菜单终于改变了
.....//可能问题在这里//
tmpBMP.free;
tmpBMP := nil;
.....
tmpBMP.free;
tmpBMP := nil;
这些代码放在进程外面,里面只是调用就行了
try
.....
finally
tmpBMP.free;
tmpBMP := nil;
end;这样可以保证即使中间的操作出现异常还可以正确释放资源
简单的Canvas.Pixel[0, 0] := clBlack; 这都会增加一个GDI计数。
代码:线程1的执行代码:
Canvas.Pixel[0, 0] := clBlack;