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

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

先获取DC,然后画图

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

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

    pDC->BitBlt(,,,,&MemDC,,,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. C++—复合类型

    内容概要: -创建和使用数组 -创建和使用C-风格字符串 -创建和使用string类字符串 -使用方法getline()和get()读取字符串 -混合输入字符串和数字 -创建和使用结构 -创建和使用共 ...

  2. C++_基础2-复合数据类型

    C语言使用术语“派生类型”,C++对类关系使用术语“派生”.所以就改用“复合类型”. 数组 数组是一种数据格式,能够存储多个同类型的值. 数组声明应指出以下三点: 存储在每个元素中的值的类型: 数组名 ...

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

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

  4. Android APP性能分析方法及工具

    近期读到<Speed up your app>一文.这是一篇关于Android APP性能分析.优化的文章.在这篇文章中,作者介绍他的APP分析优化规则.使用的工具和方法.我觉得值得大家借 ...

  5. WWDC 2013 Session笔记 - UIKit Dynamics入门

    本文涉及到的WWDC2013 Session有 1.Session 206 Getting Started with UIKit Dynamics 2.Session 221 Advanced Tec ...

  6. lnux下源码安装MySQL 5.6

    nux下源码安装MySQL 5.6 说明:本文是我自己测试的MySQL5.6源码安装,经本人亲自实践,完全可用,另在5.6之前的版本也是可以按照本文源码安装的.我是在两台linux下一台安装5.5,另 ...

  7. 查找文件是否安装以及安装路径(Ubuntu 下 )

    参考:<linux下如何查看某个软件 是否安装??? 安装路径在哪???> 原文: 如果你使用rpm -ivh matlab装的, 用rpm -qa | grep matlab肯定是能够找 ...

  8. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

  9. c# 数据库操作学习

    一. 如何处理数据库连接 1. 数据库连接可以分为“物理连接”和“逻辑连接”(默认使用连接池的情况下Pooling=true): 物理连接:创建数据库连接时,默认会有一定数量的物理连接(默认Min P ...

随机推荐

  1. cf D. Vessels

    http://codeforces.com/contest/371/problem/D 第一遍写的超时了,然后看了别人的代码,思路都是找一个点的根,在往里面加水的时候碗中的水满的时候建立联系.查询的时 ...

  2. 在Excel中将数字设置成文本格式的技巧

    在Excel中将数字设置成文本格式的技巧 一个简单的方法,利用[数据]菜单的[分列]功能来将数字设置为文本格式.具体操作步骤为: 1.选中所有需要处理的数字单元格. 2.选择[数据]菜单[分列]功能. ...

  3. 飘窗代码修改了一段js

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Wii硬盘游戏管理

    简介 wuyou是我心目中的Wii硬盘游戏管理神器,没有之一. wuyou不仅仅是一个游戏管理软件,它最亮点的地方在于集成了“游戏文件格式的转换功能”,电玩巴士上如是说: 用Wii主机来把游戏复制到硬 ...

  5. 【Python排序搜索基本算法】之Dijkstra算法

    Dijkstra算法和前一篇的Prim算法非常像,区别就在于Dijkstra算法向最短路径树(SPT)中添加顶点的时候,是按照ta与源点的距离顺序进行的.OSPF动态路由协议就是用的Dijkstra算 ...

  6. MVC4 Razor视图下使用iframe加载RDLC报表

    MVC视图下默认是不支持服务器端控件的,所以,为了能够通过report viewer控件加载报表,需要在MVC视图添加嵌入的页面. 起初在stackoverflow上找到一个解决方案,见这里.不过这里 ...

  7. nav标签的作用

    . <nav>用来将具有导航性质的链接划分在一起,使代码结构在语义化方面更加准确,同时对于屏幕阅读器等设备的支持也更好.一直以来,我们习惯于使用形如<div id="nav ...

  8. POJ3273:Monthly Expense(二分)

    Description Farmer John is an astounding accounting wizard and has realized he might run out of mone ...

  9. Com编程入门——什么是COM,如何使用COM

    本文的目的是为刚刚接触COM的程序员提供编程指南,并帮助他们理解COM的基本概念.内容包括COM规范简介,重要的COM术语以及如何重用现有的COM组件.本文不包括如何编写自己的COM对象和接口. CO ...

  10. SQL报错error:索引中丢失IN或OUT參数

    简单记录下: 今天mybatis中遇到一个错误: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallba ...