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不会自动去释放,一直占用这,直到到达极限,资源耗尽,程序就崩溃了。

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

  • 相关阅读:
    几种常用的曲线
    0188. Best Time to Buy and Sell Stock IV (H)
    0074. Search a 2D Matrix (M)
    0189. Rotate Array (E)
    0148. Sort List (M)
    0859. Buddy Strings (E)
    0316. Remove Duplicate Letters (M)
    0452. Minimum Number of Arrows to Burst Balloons (M)
    0449. Serialize and Deserialize BST (M)
    0704. Binary Search (E)
  • 原文地址:https://www.cnblogs.com/fredliu/p/4932177.html
Copyright © 2011-2022 走看看