http://www.cnblogs.com/fredliu/p/4932177.html

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

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

先获取DC,然后画图

    pDC = this ->GetDC();        // 获得显示控件的 DCthis->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不会自动去释放,一直占用这,直到到达极限,资源耗尽,程序就崩溃了

GetDC()没有释放造成的后果相关推荐

  1. GetDC 与 释放DC

    { CDC *pDC = pParent->GetDC(); ------ pParent->ReleaseDC(pDC); } Unless the device context bel ...

  2. android camera 降低帧率_Android性能问题分析之bugreport

    Android手机性能问题一直是用户关注的重点,分析性能问题则成为工程师日常工作的一部分.根据问题的类型通常有适合的工具可供使用,比如systrace ,traceview,simpleperf等可视 ...

  3. Win64 驱动内核编程-3.内核里使用内存

    内核里使用内存 内存使用,无非就是申请.复制.设置.释放.在 C 语言里,它们对应的函数是:malloc.memcpy.memset.free:在内核编程里,他们分别对应 ExAllocatePool ...

  4. C语言 跨函数使用内存.

    1. 函数执行完成时,里面的局部静态变量所占的内存会被自动释放          首先看个简单的例子程序: #include <stdio.h>int f(){int j=20;retur ...

  5. TransactionScope和分布式事务的注意点

    分布式事务听起来很不错,其实不然.它只是尽可能的降低数据不一致的可能性,并不能完全避免.从我的应用中来看,总数约5千万的操作,错了十几个.当然,这个错误率完全可以忍受了.不能忍受的是当你的DB在clu ...

  6. CVE-2021-20226:详解 Linux 内核 IO_URING 子系统中的引用计数漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士 趋势科技 ZDI 发布文章,详细描述了2020年6月收到的最近引入的 io_uring 子系统的引用计数漏洞情况.该漏洞导致在任意 fil ...

  7. UIKit Dynamics入门

    看E问文章时,发现了Dynamics,uikit动力,找了不错的入门文章. From:http://blog.csdn.net/baecheung/article/details/11911061 本 ...

  8. 我的MFC/C++学习笔记 http://blog.bccn.net/CrystalFan/6909

    2009.07.31 ------------------------------------------------------------------------------------ No.1 ...

  9. 【C语言】动态内存分配

    [C语言]动态内存分配 文章目录 [C语言]动态内存分配 一.malloc 与free函数 二.calloc 三.realloc 四.常见的动态内存的错误 本期,我们将讲解malloc.calloc. ...

最新文章

  1. IT员工的“脑出血”
  2. OSChina 周一乱弹 —— 程序员用什么浏览器能看出来品位么
  3. TCP负载均衡地址转换(锐捷设备)
  4. Iterator和ListIterator接口的使用和区别
  5. python判断两线段是否相交_c语言 判断两直线段是否相交
  6. LINQ 中的 select
  7. Nginx严格访问代理HTTP资源
  8. RECT JS 由浅入深
  9. webdriver---API---(java版) 高级应用
  10. 紫光国微:目前业务以芯片设计为主 制造占比较低
  11. RESTORE DATAFILE TO A NEW LOCATION
  12. sql server 函数--rand() 生成整数的随机数
  13. edius隐藏快捷键_超级实用的edius常用快捷键
  14. PaddlePaddle入门实践——手写数字识别
  15. 竞品分析:网易云音乐和QQ音乐,音乐类app的战场
  16. 数学模板-欧几里德算法扩展欧几里德算法
  17. 利用JD-GUI寻找JAR内部依赖
  18. Facebook更名Meta,扎克伯格押注元宇宙
  19. 23位子网掩码是多少_子网掩码划分
  20. Maven的仓库(转载自Maven实战 作者许晓斌)

热门文章

  1. 英语一点都不懂怎么学,怎么快速学好英语?
  2. 10周拿下腾讯数据分析师认证
  3. JavaScript 中的事件类型3(读书笔记思维导图)
  4. PLSQL developer14/PLSQL14如何修改字体和文字大小,如何修改背景颜色?
  5. 开箱 | 小度智能音箱初体验
  6. 全球最大多物种水族馆将于5月23日向公众开放,容纳68000多只海洋动物 | 美通社头条...
  7. MQTT跨ip/跨机访问
  8. java 计算星座算法,java 依据生日计算星座
  9. 【java】新建项目
  10. java ajax教程_Jquery ajax基础教程