MFC 是基于消息队列响应的应用程序框架,UI 和后台关联的代码都属于主工作进程, 如果和UI关联的后台代码阻塞住,那么UI会失去相应,无法接受用户的操作。一般的,如果一段代码需要较长的执行时间,我们会新建一个线程去执行这段代码,执行完后再把结果报告给主工作线程。今天看到一段代码,讲的是DoEvents函数的使用,它可以让出当前操作对系统的占有权,让系统先响应其它消息,然后再回来处理当前任务,摘自MSDN的解释如下:

在运行 Windows 窗体时,它会创建新窗体,然后等待事件来处理。每次窗体处理事件时,它处理与该事件相关联的所有代码。在队列中等待的所有其他事件。虽然您的代码处理事件时,您的应用程序没有响应。例如,如果另一个窗口拖动在最前面,也不重新绘制窗口中。

如果您调用DoEvents在代码中,您的应用程序可以处理其他事件。例如,如果您将数据添加到窗体ListBox并添加DoEvents到代码中,您的窗体可时重新绘制另一个窗口拖到它。如果您删除DoEvents从您的代码,您的窗体不会重新绘制按钮的单击事件处理程序完成之前执行。

通常情况下,您将在处理消息循环中使用此方法。

Note:

调用此方法会导致当前线程在处理所有等待窗口消息时要挂起。如果消息导致事件被触发,可能会执行应用程序代码的其他区域。这会导致您的应用程序展示难以调试的意外的行为。如果您执行的操作或需要很长时间的计算,通常最好是一个新的线程上执行的运算

函数实现如下:void DoEvents()
{MSG msg;while(::PeekMessage(&msg,NULL,0,0,PM_REMOVE));{::DispatchMessage(&msg);::TranslateMessage(&msg);}
}

示例:

如果后台代码是这样子的:

void myAPP::OnButton1()

{

UINT i = 0;

for(i=0;i<10000;i++)

{

//Nothing;

}

}

那么UI只能等for循环执行完才能响应新的消息,而如果像下面这样:

void myAPP::OnButton1()

{

UINT i = 0;

for(i=0;i<10000;i++)

{

DoEvents();

}

}

在for循环的每一个loop里面,都能再次响应UI的消息。

DoEvents 方法使用小结相关推荐

  1. aspx 追加html标签,ASP.NET动态增加HTML元素的方法实例小结

    本文实例讲述了ASP.NET动态增加HTML元素的方法.分享给大家供大家参考,具体如下: 在使用asp.net进行web开发的时候页面中的 中的信息可以通过asp.net的cs文件动态指定. 1.动态 ...

  2. created写法_在vue中created、mounted等方法使用小结

    created:html加载完成之前,执行.执行顺序:父组件-子组件 mounted:html加载完成后执行.执行顺序:子组件-父组件 methods:事件方法执行 watch:watch是去监听一个 ...

  3. String类的对象的方法 格式小结 java 1202

    String类的对象的方法 格式小结 java 1202 定义一个字符串 两种方法可以定义字符串 String 字符串对象 = "内容" String 字符串对象 = new St ...

  4. php监听iframe加载完成,window_IE iframe的onload方法分析小结,判断iframe是否加载完成的完美 - phpStudy...

    IE iframe的onload方法分析小结 判断iframe是否加载完成的完美方法IE 支持 iframe 的 onload 事件,不过是隐形的,需要通过 attachEvent 来注册. 第二种方 ...

  5. 数据分析的统计方法选择小结(变量之间的关联性分析)

    数据分析的统计方法选择小结(变量之间的关联性分析) 一.两个变量之间的关联性分析 1.两个变量均为连续型变量 1)小样本并且两个变量服从双正态分布,则用Pearson相关系数做统计分析 2)大样本或两 ...

  6. 创建 dict 的几种方法学习小结

    创建 dict 的几种方法学习小结 dict(全称 dictionary,可以翻译为"字典"),其使用"键-值(key-value)"对儿的方式存储多项数据,是 ...

  7. html根据坐标画圆,Canvas三种动态画圆实现方法说明(小结)

    前言 canvas是HTML5出来的绘图API容器,对于图形的处理非常强大,下面使用canvas配合JavaScript来做一下动态画圆效果.可以用它来做圆形进度条来使用. 这里我个人总结了3种实现方 ...

  8. [转载]一个Spectral Clustering方法的小结

    什么叫SpectralAlgorithm?;广义上来说,任何在演算法中用到SVD/特征值分解的,都叫SpectralAlgorithm.从很老很老的PCA/LDA,到比较近的SpectralEmbed ...

  9. List的Clear方法与RemoveAll方法用法小结

    示例代码 [csharp] view plain copy using System; using System.Collections.Generic; namespace ListClearExp ...

  10. VxWorks下几种定时延时方法的小结

    1 taskDelay taskdelay()提供了一个简单的任务睡眠机制,也常用于需要定时/延时机制的应用中. 它的格式是 STATUS taskDelay(int ticks   /* numbe ...

最新文章

  1. LeetCode实战:搜索二维矩阵
  2. C语言程序设计50例(三)(经典收藏)
  3. python中文字符编码问题
  4. 基于php响应式网站毕业论文,基于html5与css3的响应式web页面设计与实现.docx
  5. 信息系统项目管理师-第5章:项目范围管理-重点汇总
  6. SQL注入_1-6_user-agent注入
  7. iOS之深入解析UmbrellaFramework的封装与应用
  8. equipment download scenario3
  9. Ubuntu Linux系统环境变量配置文件
  10. 网页设计上机考试原题_全国计算机三级信息安全考试 经验分享
  11. filter滤镜实现img图片的CSS蒙版效果、模糊效果
  12. C# ReportViewer 绑定数据源
  13. (转)C#开发微信门户及应用(5)--用户分组信息管理
  14. python填空题及答案知乎_zhihu-python
  15. 《穿越计算机的迷雾》
  16. 现代软件工程学期总结
  17. java上传图片压缩大小
  18. word如何去掉标题前面的黑点
  19. 王者荣耀服务器维护9月27,王者荣耀9月27日更新维护公告 修复夏洛特技能bug等...
  20. 靶机11 Empire Lupin One

热门文章

  1. fiddler 手机 https 抓包
  2. 示教器重定位下机器人动作_ABB机器人示教器入门-初级教学|干货
  3. NoteExpress文献题录如何导出到excel
  4. STM32单片机初学1-STM32介绍
  5. python步态识别算法_深度学习在步态识别中的应用
  6. php简历掌握技能,php简历技能怎么写
  7. ESP8266-Arduino网络编程实例-BME280传感器数据仪表显示
  8. oracle优化distinct,oracle中使用group by优化distinct
  9. Deepin 20.1 安装nvidia显卡驱动 爬坑
  10. oracle的odac dll,.NET2.0中施用最少的ODAC动态库文件连接Oracle数据库