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

由于比较简单,就直接使用了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. iOS页面间传值的方式 (Delegate/NSNotification/Block/NSUserDefault/单例)

    iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)   iOS页面间传值的方式(NSUserDefault/Delegate/NSN ...

  2. JQuery整体大纲

    今天公司放假,闲的无聊,就总结了一套JQuery的笔记,我感觉更像是大纲,在这里跟大家分享一下,这是我的成果: 这个就是我的劳动成果了,说实话真是不容易,为了做这个东西,翻阅了很多以前做过的笔记,发现 ...

  3. KEIL C51的XBYTE关键字

    The XBYTE macro allows you to access individual bytes in the external data memory of the 8051. You m ...

  4. 14.4.4 Redo Log Buffer

    14.4.4 Redo Log Buffer redo log buffer 是内存区域持有数据被写入到redo log. Redo log buffer size 是通过 innodb_log_bu ...

  5. HBase HTablePool

    Instead of creating an HTable instance for every request from your client application, it makes much ...

  6. C#实现数据结构——线性表(上)

    什么是线性表 数据结构中最常用也最简单的应该就是线性表,它是一种线性结构(废话,不是线性结构怎么会叫线性表?当然不是废话,古人公孙龙就说白马非马,现代生物学家也说鲸鱼不是鱼). 那什么是线性结构? 按 ...

  7. 一个简单的JUnit项目

    本人一直很喜欢JAVA,可是真正接触到JUnit也不过半年.由于公司进行网页测试,采用的是 JUnit+selenium的方式搭建的测试框架,然后采用JAVA语言编写,所以本人也好好研究了一下JUni ...

  8. NEXT | 不错过任何一个新产品

    NEXT | 不错过任何一个新产品 NEXT 不错过任何一个新产品

  9. Java图像灰度化的实现过程解析

    概要 本文主要介绍了灰度化的几种方法,以及如何使用Java实现灰度化.同时分析了网上一种常见却并不妥当的Java灰度化实现,以及证明了opencv的灰度化是使用“加权灰度化”法 24位彩色图与8位灰度 ...

  10. SAE 搭建 WordPress

    WordPress,是国外一款使用PHP语言开发的开源博客平台,用户可以在支持PHP和MySQL 数据库的服务器上架设自己的博客站点,也可以把 WordPress 当作一个内容管理系统(CMS)来使用 ...