定时器3秒执行一次
- Invalidate();
- UpdateWindow();
整个程序就干这一件事,隔3秒显示一张图片。但是我用wince的系统属性查看正在使用的内存数,隔几分钟就会增长4K,我联系观察了几个小时,很有规律。
- void CshowphotoDlg::OnPaint()
- {
- CPaintDC dc(this); // device context for painting
- static BYTE i=0;
- TCHAR strtp[256];
- wsprintf(strtp,L"\\nand flash\\cdqres\\%d.bmp",i%3);
- i++;
- HBITMAP hBitmapBk;
- hBitmapBk=(HBITMAP)SHLoadDIBitmap( strtp);
- CRect rectBK; // 客户区的大小
- CDC dcTemp;
- CBitmap clientBmp;
- CBitmap bmBK; // 位图对象
- bmBK.Attach( hBitmapBk );
- BITMAP stBitmap;
- bmBK.GetObject(sizeof(BITMAP),&stBitmap);
- CSize bmSize(stBitmap.bmWidth,stBitmap.bmHeight);
- dcTemp.CreateCompatibleDC(&dc);
- CBitmap *pOld=dcTemp.SelectObject(&bmBK);
- GetWindowRect(&rectBK); // 取得客户区的大小
- dcMen.CreateCompatibleDC(&dc);
- clientBmp.CreateCompatibleBitmap(&dc,rectBK.Width(),rectBK.Height());
- CBitmap *pOld1=dcMen.SelectObject(&clientBmp);
-
- dcMen.StretchBlt(rectBK.left,rectBK.top,rectBK.Width(),rectBK.Height(),&dcTemp,0,0,bmSize.cx,bmSize.cy,SRCCOPY);
-
- dc.BitBlt(rectBK.left,rectBK.top,rectBK.Width(),rectBK.Height(),&dcMen,rectBK.left,rectBK.top,SRCCOPY);
- dcTemp.SelectObject(pOld);
- dcTemp.DeleteDC();
- dcMen.SelectObject(pOld1);
- dcMen.DeleteDC();
- bmBK.Detach();
- clientBmp.DeleteObject();
- DeleteObject(hBitmapBk);
- }
如果有,应该是DC的操作
但是偶没有看出来,只能建议LZ将代码分拆测试,看看具体是哪部分出的问题
也有可能,只是产生了内在碎片,CE系统没有及时回收
建议LZ,不要将hBitmapBk=(HBITMAP)SHLoadDIBitmap( strtp);放在循环体内(定时循环)
最好在应用启动时加载,结束时释放.
据说wince的兼容位图天生会泄露内存,微软也还没解决。建议LZ不要经常使用兼容位图,不要频繁创建
有内存泄露的为问题很正常,usb的host部分驱动就有泄漏,自己找了半天才找到,这些问题通常都在bsp中,修改应用使用方法基本没啥用,只要没有致命的问题,就凑活着用吧。
我在网上发现了一篇文章,由于我的擦除背景函数没用,只有一句return true;,所以我把Invalidate();改成Invalidate(0);就没问题了。内存不再增加。
另一问题,在程序第一次退出,再启动后,发现内存多出了48k,以后程序退出再启动都不会多。系统掉电再试,结果和前面的描述一样。