zoukankan      html  css  js  c++  java
  • 告诉你GetDC()没有释放造成的后果

    最近做的项目中需要显示视频监控窗口,从采集卡中读到图像的数据,需要实时显示出来,而且速度比较快。

    由于比较简单,就直接使用了GDI画图,以前复杂的都用openGL啥的工具了,这次这个简单,就直接用GDI了。

    先获取DC,然后画图

        pDC = this ->GetDC();        // 获得显示控件的 DC
        this->GetClientRect(rect);
        MemDC.CreateCompatibleDC(NULL); 
        //这时还不能绘图,因为没有地方画 ^_^ 
        //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小    
        MemBitmap.CreateCompatibleBitmap(pDC,640,480);         
        pentemplate.CreatePen(PS_SOLID,1,RGB(0,255,255));
        penkuang.CreatePen(PS_SOLID,1,RGB(255,0,255));
        MemDC.SelectObject(&MemBitmap); 
        //printf("\n 拷贝图片");
        StretchDIBits(MemDC.m_hDC,                                // 设备环境句柄
            0,                 //目标X坐标
            0,                  // 目标Y坐标
            640,            // 目标宽度
            480,           // 目标高度
            0,                // 源X坐标
            0,                 // 源Y坐标
            640,           // 源宽度
            480,          // 源高度
            ImageBuff,                //图像数据指针BYTE*
            &bmpInfo,         // 指向位图信息结构的指针
            DIB_RGB_COLORS,                 // 使用的颜色数目
            SRCCOPY); 

    结束后进行释放内存DC和创建的画笔对象

        pDC->BitBlt(0,0,640,480,&MemDC,0,0,SRCCOPY); 
        //printf("画图结束\n");
        
        MemBitmap.DeleteObject(); 
        penkuang.DeleteObject();
        pentemplate.DeleteObject();
        MemDC.DeleteDC(); 

    注意,此时只对创建的内存DC和画笔对象进行了释放,对获取的pDC没有释放,这样短时间没什么问题,但是程序跑了几分钟以后,界面就没有反映了,整个界面卡死了,完全动不了。

    这个问题困扰了我好几天,试了各种方法无果。

    后来请教了一个朋友,朋友看到代码后,说pDC没有释放,我说GetDC需要释放吗,又不是new的。他说需要释放。

    于是添加了

    ReleaseDC(pDC);

    重新跑下程序,跑了一天一也没有死。

    但是问什么不释放会使程序界面卡死呢?于是对释放和不释放两个版本的程序进行观察。

    启动任务管理器,把GDI对象添加到进程列中,观察两个版本的程序运行情况。程序名为OnlineFast

    使用释放的版本,可以看到GDI对象保持157不变。

    如果没有释放的话,GDI对象会一直增加

    当然,此时程序还没有死,但运行一段时间后,当GDI对象增加到10000的时候,程序就死了,这就是GDI对象的极限了。

    所以,GetDC 和ReleaseDC一定要配对使用,获取了,没有去释放,windows不会自动去释放,一直占用这,直到到达极限,资源耗尽,程序就崩溃了。

    照例贴上俩儿子的照片,又离家一个月了,一个月没见到俩儿子了。

  • 相关阅读:
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    iOS开发系列--IOS程序开发概览
    iOS开发系列—Objective-C之Foundation框架
  • 原文地址:https://www.cnblogs.com/fredliu/p/4932177.html
Copyright © 2011-2022 走看看