一个电力系统的监控平台,上面画有实时绘制的元器件,也有从外部添加的位图等,现在问题就是当我切换到位图很多的画面拷机时,第二天来监控程序出现无法刷新,就是那些位图根本刷不出来了,而且系统运行缓慢,其他程序的界面也刷的很慢的样子,不过这时我程序的CPU和内存占用也并不是很大,系统总的空闲资源也还比较多。以下是我绘图的代码,大家帮我看看是不是有什么问题,或者这种问题出在什么地方,谢谢!(item_info->Text保存的是每个图片的文件路径,下面的代码是在OnDraw()里面的) IPicture *m_picture; 
OLE_YSIZE_HIMETRIC m_height; 
OLE_XSIZE_HIMETRIC m_width; 
CFile m_file(item_info->Text,CFile::modeRead ); DWORD m_filelen = m_file.GetLength(); 
HGLOBAL m_hglobal = GlobalAlloc(GMEM_MOVEABLE,m_filelen); 
LPVOID pvdata = NULL; 
pvdata = GlobalLock(m_hglobal); 
m_file.ReadHuge(pvdata,m_filelen); 
IStream*  m_stream; 
GlobalUnlock(m_hglobal); 
CreateStreamOnHGlobal(m_hglobal,TRUE,&m_stream); Image image(m_stream); 
Graphics gr(pDC->m_hDC); 
gr.DrawImage(&image, rect.left, rect.top, rect.Width(),rect.Height()); m_stream->Release(); 
m_picture->Release();

解决方案 »

  1.   

    查看你的任务管理器中,add column,选择GDI对象,看你的进程的GDI对象个数是否达到1w了,可能你的gdi资源耗尽了,检查一下是否有GDI资源泄漏
      

  2.   

    同意!代码是不是拷漏了?m_picture根本就没有用过喃?
      

  3.   

    代码被我改过几次,原来用了m_picture,后来注释掉了,请问这个有影响吗
      

  4.   

    你是用CDC来绘图的吗?记得调用GetDC()函数时一定要在用完后调用ReleaseDC(pDC)释放。
      

  5.   

    是不是应该用二进制方式读取数据?如下:
    CFile m_file(item_info->Text,CFile::modeRead | CFile::typeBinary ); 
      

  6.   

    第一:加载文件这种操作不要在刷新的时候做,最好在初始化的时候就做好,每次刷新就加载是很浪费的事情。
    第二:你代码不贴全,看起来前后不对应的,只有自己检查看了,创建的对象要销毁,Release之后要赋值为0。
      

  7.   

    我认为最好test下有无gdi对象泄露。另外你系统变慢是开始执行后“很快”就变慢,还是要经过相当一段时间?这个lz没说清楚。这是判断的关键。因为你的代码没拷全,似乎。
      

  8.   

    不见得是GDI对象泄漏,我以前碰到过类似的问题。如果你的程序实时性比较高,而且绘图时总是不停的分配/释放内存,很大的可能是内存碎片造成的,建议你自己建立一个私有堆,自己实现IStream接口来处理内存操作这块。