利用CDC类的双缓存方法绘图,出现资源泄漏的问题
各位大侠:
项目需要,小弟初学VC++,要利用WINCE系统来编写一个界面显示程序,这个程序主要是将从其他地方采集到的数据以波形形式显示到界面上。
网上主要有利用CDC类,即利用CDC MemDC;CBitmap MemBitmap;详见http://baike.baidu.com/view/1149326.htm?fromTaglist所列出的方法,本人正是用这种方法来实现的,但是在调试过程中发现,时间一长,显示刷新就会越来越慢,而且查看资源可以看到,大概每3、4个周期,就会有12KB的内存增加。网上有说,这个是因为利用了CWnd类的GetDC和ReleaseDC的缘故(我程序中确实有用这个来得到子控件的DC),网上有推荐采用HDC的方式,但是我对这种方式很不熟悉,也查了论坛的很多帖子,一直搞不出来,所以想请教各位大侠,应该如何利用HDC方式来实现双缓存的图形显示(我要实现背景为黑色,线条为白色的画图方式),用这种方式应该尤其注意哪些问题,才能保证不会出现内存的泄漏,哪些该release,哪些该delete,那些pen需要delete吗?
另外,如果我仍然想利用CDC类的方式来实现双缓存的显示而不造成资源的泄漏,能够实现吗?又该怎样修改呢?
麻烦各位了,请大家帮我一下,希望能稍微详细些。先谢过了。
[解决办法]
ReleaseDC().
[解决办法]
检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
[解决办法]
GDI里面的Pen, brush,GetDC来的DC都要释放
[解决办法]
你的MemBitmap没有释放啊,
MemBitmap.deleteObject()
还有,releaseDC改正:
pWnd->releaseDC(pDC)
[解决办法]
要把oldpen等初始的,重新选回去,否则deleteobject会失败
Deletes the attached Windows GDI object from memory by freeing all system storage associated with the Windows GDI object.
BOOL DeleteObject( );
Return Value
Nonzero if the GDI object was successfully deleted; otherwise 0.
Remarks
The storage associated with the CGdiObject object is not affected by this call.
An application should not call DeleteObject on a CGdiObject object that is currently selected into a device context.
When a pattern brush is deleted, the bitmap associated with the brush is not deleted. The bitmap must be deleted independently.