双缓冲文字输出内存泄露?如何改
双缓冲文字输出内存泄露?怎么改?
本帖最后由 VisualEleven 于 2012-11-18 12:09:47 编辑 最近做一个监控界面,需要使用大字体刷新测量数据,出现故障时需要将字色变为红色
我定义了一个CColorStatic类
在OnPaint中写
界面上有10个CColorStatic控件需要刷新,刷新频率为1秒一次
发现程序运行后,开头30秒左右内存使用一直没问题,之后大约4秒左右
程序使用内存增加4K的样子,时间久了之后,如果打开其他功能界面,
就会出现一些CColorStatic框变成了其他功能界面的图形,且在也不能刷新了
在调试过程中试过将刷新的timer禁用,内存一直不会增长。
试过将BitBlt这一句注释,发现内存也不会增长。。。。。!!!
现在就不知道是哪儿的问题了。
目标计算机是WinCE的。。。
高手帮看看
------最佳解决方案--------------------
m_hdcMem.SelectObject(&m_hBitmap);
m_hdcMem.SelectObject(&m_font); //使用大字体
需要将原值保留,退出时复原
------其他解决方案--------------------
选入的位图和字体都要恢复
------其他解决方案--------------------
if (m_hdcMem.CreateCompatibelDC(NULL)
为什么不是 dc ?
------其他解决方案--------------------
SelectObject选择对象之后一个返回资源指针(上一次的资源指针)。
在结束的时候需要重新SelectObject这个资源指针。就是所谓的还原
这样才不会出现楼主所说的问题。
------其他解决方案--------------------
试过的将它们保留,恢复,还是一样的
------其他解决方案--------------------
你没有用多线程或者timeSetEvent()函数吧,因为DC是稀缺资源,同时申请可能不够用.
------其他解决方案--------------------
后台是个线程获取各个点的数据,通过一个timer循环对每个Static进行SetWindowText操作
现在发现,时间长了之后,调试发现m_hdcMem中有个hDC(DC的指针=0x000000000)...
问题是BitBlt屏蔽后为什么就不会吃掉内存了啊?我的内存释放有没有问题啊?
刷新的机制没有进行延时,循环体直接是一个接一个,没有延时,不过
在刷新内部有对数据的判断,有几十行的代码吧
------其他解决方案--------------------
选入的位图和字体 试过都重新Select回去,还是一样的结果
schlafenhamster:
如果使用m_hdcMem.CreateCompatibelDC(dc)也是一样的结果
------其他解决方案--------------------
BOOL ret=m_hBitmap.DeleteObject();
看看是不是真的。
------其他解决方案--------------------
CDC m_hdcMem;
CBitmap m_hBitmap;
都是类成员?换成局部变量试试
------其他解决方案--------------------
tiger:
重新选入老的字体和图片都测试过的,还是有问题的。
schlafenhamster:
嗯,下午去办公室试试,还有其他的函数都看看是不是正常返回
看有什么问题没有
mcmcmc :
是在OnPaint里面定义的局部变量
------其他解决方案--------------------
本帖最后由 VisualEleven 于 2012-11-18 12:09:47 编辑 最近做一个监控界面,需要使用大字体刷新测量数据,出现故障时需要将字色变为红色
我定义了一个CColorStatic类
在OnPaint中写
CPaintDC dc(this);
CDC m_hdcMem;
CBitmap m_hBitmap;
if (m_hdcMem.CreateCompatibelDC(NULL) == 0)
{
m_hdcMem.DeleteDC();
return;
}
CRect rect;
GetClientRect(&rect);
if (m_hBitmap.CreateCompatibleBitmap(&dec, Rect.Width() + 1, rect.Height() + 1) == 0)
{
m_hBitmap.DeleteObject();
m_hdcMem.DeleteDC();
return;
}
m_hdcMem.SelectObject(&m_hBitmap);
CString strText = _T("");
GetWindowText(strText);
....
m_hdcMem.FillRect(&rect, m_pBrush);//填充黑色
m_hdcMem.SelectObject(&m_font); //使用大字体
m_hdcMem.SetTextColor(m_rgbText);
m_hdcMem.SetBkMode(TRANSPARENT);
m_hdcMem.DrawText(strText, rect, nFormat);
//nFormat是设置文字左中右的,用的DWORD dwStyle = GetStyle()
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &m_hdcMem, 0, 0, SRCCOPY);
m_hdcMem.DeleteDC();
m_hBitmap.DeleteObject();
界面上有10个CColorStatic控件需要刷新,刷新频率为1秒一次
发现程序运行后,开头30秒左右内存使用一直没问题,之后大约4秒左右
程序使用内存增加4K的样子,时间久了之后,如果打开其他功能界面,
就会出现一些CColorStatic框变成了其他功能界面的图形,且在也不能刷新了
在调试过程中试过将刷新的timer禁用,内存一直不会增长。
试过将BitBlt这一句注释,发现内存也不会增长。。。。。!!!
现在就不知道是哪儿的问题了。
目标计算机是WinCE的。。。
高手帮看看
------最佳解决方案--------------------
m_hdcMem.SelectObject(&m_hBitmap);
m_hdcMem.SelectObject(&m_font); //使用大字体
需要将原值保留,退出时复原
------其他解决方案--------------------
选入的位图和字体都要恢复
------其他解决方案--------------------
if (m_hdcMem.CreateCompatibelDC(NULL)
为什么不是 dc ?
------其他解决方案--------------------
SelectObject选择对象之后一个返回资源指针(上一次的资源指针)。
在结束的时候需要重新SelectObject这个资源指针。就是所谓的还原
这样才不会出现楼主所说的问题。
------其他解决方案--------------------
试过的将它们保留,恢复,还是一样的
------其他解决方案--------------------
你没有用多线程或者timeSetEvent()函数吧,因为DC是稀缺资源,同时申请可能不够用.
------其他解决方案--------------------
后台是个线程获取各个点的数据,通过一个timer循环对每个Static进行SetWindowText操作
现在发现,时间长了之后,调试发现m_hdcMem中有个hDC(DC的指针=0x000000000)...
问题是BitBlt屏蔽后为什么就不会吃掉内存了啊?我的内存释放有没有问题啊?
刷新的机制没有进行延时,循环体直接是一个接一个,没有延时,不过
在刷新内部有对数据的判断,有几十行的代码吧
------其他解决方案--------------------
选入的位图和字体 试过都重新Select回去,还是一样的结果
schlafenhamster:
如果使用m_hdcMem.CreateCompatibelDC(dc)也是一样的结果
------其他解决方案--------------------
BOOL ret=m_hBitmap.DeleteObject();
看看是不是真的。
------其他解决方案--------------------
CDC m_hdcMem;
CBitmap m_hBitmap;
都是类成员?换成局部变量试试
------其他解决方案--------------------
tiger:
重新选入老的字体和图片都测试过的,还是有问题的。
schlafenhamster:
嗯,下午去办公室试试,还有其他的函数都看看是不是正常返回
看有什么问题没有
mcmcmc :
是在OnPaint里面定义的局部变量
------其他解决方案--------------------