GetDC()没有释放造成的后果
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()没有释放造成的后果相关推荐
- GetDC 与 释放DC
{ CDC *pDC = pParent->GetDC(); ------ pParent->ReleaseDC(pDC); } Unless the device context bel ...
- android camera 降低帧率_Android性能问题分析之bugreport
Android手机性能问题一直是用户关注的重点,分析性能问题则成为工程师日常工作的一部分.根据问题的类型通常有适合的工具可供使用,比如systrace ,traceview,simpleperf等可视 ...
- Win64 驱动内核编程-3.内核里使用内存
内核里使用内存 内存使用,无非就是申请.复制.设置.释放.在 C 语言里,它们对应的函数是:malloc.memcpy.memset.free:在内核编程里,他们分别对应 ExAllocatePool ...
- C语言 跨函数使用内存.
1. 函数执行完成时,里面的局部静态变量所占的内存会被自动释放 首先看个简单的例子程序: #include <stdio.h>int f(){int j=20;retur ...
- TransactionScope和分布式事务的注意点
分布式事务听起来很不错,其实不然.它只是尽可能的降低数据不一致的可能性,并不能完全避免.从我的应用中来看,总数约5千万的操作,错了十几个.当然,这个错误率完全可以忍受了.不能忍受的是当你的DB在clu ...
- CVE-2021-20226:详解 Linux 内核 IO_URING 子系统中的引用计数漏洞
聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士 趋势科技 ZDI 发布文章,详细描述了2020年6月收到的最近引入的 io_uring 子系统的引用计数漏洞情况.该漏洞导致在任意 fil ...
- UIKit Dynamics入门
看E问文章时,发现了Dynamics,uikit动力,找了不错的入门文章. From:http://blog.csdn.net/baecheung/article/details/11911061 本 ...
- 我的MFC/C++学习笔记 http://blog.bccn.net/CrystalFan/6909
2009.07.31 ------------------------------------------------------------------------------------ No.1 ...
- 【C语言】动态内存分配
[C语言]动态内存分配 文章目录 [C语言]动态内存分配 一.malloc 与free函数 二.calloc 三.realloc 四.常见的动态内存的错误 本期,我们将讲解malloc.calloc. ...
最新文章
- IT员工的“脑出血”
- OSChina 周一乱弹 —— 程序员用什么浏览器能看出来品位么
- TCP负载均衡地址转换(锐捷设备)
- Iterator和ListIterator接口的使用和区别
- python判断两线段是否相交_c语言 判断两直线段是否相交
- LINQ 中的 select
- Nginx严格访问代理HTTP资源
- RECT JS 由浅入深
- webdriver---API---(java版) 高级应用
- 紫光国微:目前业务以芯片设计为主 制造占比较低
- RESTORE DATAFILE TO A NEW LOCATION
- sql server 函数--rand() 生成整数的随机数
- edius隐藏快捷键_超级实用的edius常用快捷键
- PaddlePaddle入门实践——手写数字识别
- 竞品分析:网易云音乐和QQ音乐,音乐类app的战场
- 数学模板-欧几里德算法扩展欧几里德算法
- 利用JD-GUI寻找JAR内部依赖
- Facebook更名Meta,扎克伯格押注元宇宙
- 23位子网掩码是多少_子网掩码划分
- Maven的仓库(转载自Maven实战 作者许晓斌)
热门文章
- 英语一点都不懂怎么学,怎么快速学好英语?
- 10周拿下腾讯数据分析师认证
- JavaScript 中的事件类型3(读书笔记思维导图)
- PLSQL developer14/PLSQL14如何修改字体和文字大小,如何修改背景颜色?
- 开箱 | 小度智能音箱初体验
- 全球最大多物种水族馆将于5月23日向公众开放,容纳68000多只海洋动物 | 美通社头条...
- MQTT跨ip/跨机访问
- java 计算星座算法,java 依据生日计算星座
- 【java】新建项目
- java ajax教程_Jquery ajax基础教程