转载出处:http://blog.csdn.net/tsing_best/article/details/25055707

CWinApp::OnIdle
virtual BOOL OnIdle( LONG lCount );
返回值
  如果要接收更多的空闲处理时间,则返回非零值;如果不需要更多的空闲时间则返回0。
参数
  lCount 该参数是一个计数值,当应用程序的消息队列为空,OnIdle函数被调用时,该计数值就增加1。
  每当一条新消息被处理时,该计数值就被复位为0。你可以使用lCount参数来确定应用程序不处理消息时空闲时间的相对长度。
说明
  如果要执行空闲时处理,则重载这个成员函数。当应用程序的消息队列为空时,OnIdle就在缺省的消息循环中被调用。
  你可以用重载函数来调用自己的后台空闲处理任务。
  OnIdle应返回0以表明不需要更多的空闲处理时间。
  当消息队列为空时,OnIdle每被调用一次lCount参数就增加,而每处理一条新消息lCount就被复位为0。
  你可以根据这个计数值调用不同的空闲处理例程。

  下面总结了空闲循环处理:
  1、如果微软基础类库中的消息循环检查消息队列并发现没有未被处理的消息,它就为应用程序对象调用OnIdle函数,并将lCount参数设为0。
  2、OnIdle执行一些处理,然后返回一个非零值,表示它还需要被调用,以进行进一步处理。
  3、消息循环再次检查消息队列。如果没有未处理的消息,则再次调用OnIdle,增加lCount参数。
  4、最后,OnIdle结束所有的空闲任务并返回0。
  这就告诉消息循环停止调用OnIdle直到在消息队列中接收到下一条消息为止,在那时,空闲循环将重新启动,而参数被设为0。
因为只有在OnIdle返回之后应用程序才能处理用户输入,因此在OnIdle中不应进行较长的任务。

注意
  OnIdle的缺省实现更新命令用户接口对象,如菜单项和工具条等,还实现了内部数据结构的清理。
  因此,如果你重载了OnIdle,你必须用重载版本中使用的lCount值来调用CWinApp::OnIdle。
  首先调用所有基类的空闲处理(即直到基类的OnIdle返回0)。
  如果你需要在基类处理完成之前进行一些工作,则应回顾基类的实现以在自己的工作期间选择一个合适的lCount值。

示例
  下面的两个例子演示了OnIdle的用法。

  第一个例子处理两个空闲任务,用lCount参数来排列这些任务的优先权。
  第一个任务优先权较高,一旦可能你就应当执行此任务。第二个任务不十分重要,只有当用户输入有一个较长时间的间歇的时候才应执行此任务。
  注意其中对基类的OnIdle的调用。
  第二个例子管理着一组具有不同优先权的空闲任务。

BOOL CMyApp::OnIdle(LONG lCount)
{
  BOOL bMore = CWinApp::OnIdle(lCount);
  if (lCount == )
  {
    TRACE("App idle for short period of time/n");
    bMore = TRUE;
  }
  else if (lCount == )
  {
  TRACE("App idle for longer amount of time/n");
  bMore = TRUE;
  }
  else if (lCount == )
  {
    TRACE("App idle for even longer amount of time/n");
    bMore = TRUE;
  }
  else if (lCount == )
  {
    TRACE("App idle for quite a long period of time/n");
    // bMore 没有被设为TRUE, 不在需要空闲
    // 重要:bMore 没有被设为 FALSE,因为 CWinApp::OnIdle可能还有其它空闲任务要完成。
  }
  return bMore; // 返回TRUE,只要还有其它空闲任务
}

第二个示例:
// 在这个例子中,有四个空闲循环任务,它们被赋予
// 不同的优先权,运行的机会不同:
// Task1在空闲时总能运行,要求在框架处理它自己的空闲循环任务时没有消息在等候。(lCount为0或1)
// Task2 仅当Task1以及运行时才能运行,要求当Task1运行时没有消息在等候。
// Task3和Task4仅当Task1和Task2都运行之后才能运行,
// 并且在此期间没有消息在等候。如果Task3能够运行,
// 则Task4总是在Task3之后立即运行。
BOOL CMyApp::OnIdle(LONG lCount)
{
// 在这个例子中,像多数应用程序一样,你应该让基类
// 的CWinApp::OnIdle在你试图进行任何附加的空闲循环
// 过程之前完成它的处理。
if (CWinApp::OnIdle(lCount)) return TRUE;
// 基类的CWinApp::OnIdle为lCount保留0和1给框架自己的
// 空闲处理使用。如果你希望与框架平等地共享空闲处理
// 时间,则应替换上面的if语句,直接调用CWinApp::OnIdle,
// 然后为lCount的值0和/或1加入一个case语句。首先应当研
// 究基类的实现以理解你的空闲循环任务将会如何与框架的
// 空闲循环处理竞争。
switch (lCount)
{
  case 2:
    Task1();
    return TRUE; // 下一次给 Task2 一个机会
  case 3:
    Task2();
    return TRUE; // 下一次给Task3和Task4一个机会
  case 4:
    Task3();
    Task4();
    return FALSE; // 再次回到空闲循环任务
  }
  return FALSE;
}
///注意
在VC基于对话框程序中,似乎不能使用OnIdle。从网上查了一下,可以用WM_KICKIDLE消息实现相同功能。WM_KICKIDLE消息响应需要自己手动添加代码。下面是步骤:
1.MyDlg.cpp文件添加包含:
#include <afxpriv.h>
2.MyDlg.h文件添加声明
afx_msg LRESULT OnKickIdle(WPARAM wParam, LPARAM lParam);
3.MyDlg.cpp文件添加消息映射:
ON_MESSAGE(WM_KICKIDLE,OnKickIdle)
4.MyDlg.cpp添加函数的实现:
LRESULT CMyDlg::OnKickIdle(WPARAM wParam, LPARAM lParam)
{
  //------TODO--------------------------------

  return 0;
}

【转】MFC OnIdle的详细说明的更多相关文章

  1. MFC对话框编程详细学习笔记

    因最近研究工作要用到MFC,故再次重温了孙鑫老师的MFC对话框编程,因所用的编译软件为VS2008,与视频中孙老师使用的VC++6.0有很大出入,造成很大不便,我通过各方查找,实现了VS2008相对应 ...

  2. VS中为什么不同的项目类型属性查看和设置的界面不一样

    在VS中,存在ATL.MFC.Win32.CLR.常规等等各种工程模板,这些工程模板对应于开发不同类型的应用,比如要开发com,你应该选ATL:开发最原始的通过API代用操作系统的应用,应该用Win3 ...

  3. MFC的PNG贴图按钮类(详细注释)

    MFC的PNG贴图按钮类(详细注释) (转载请注明出处) 作者:梦镜谷雨 萌新第二次写帖子,请多多包涵.末尾附上相应代码(PS公司繁体系统所以部分注释繁体请别介意). 因自带控件不美观,于是网上参考学 ...

  4. MFC中CString.Format的详细用法

          本文转载自:http://blog.csdn.net/wangkaishou/article/details/5846152,感谢网友 Technorati 标签: CString For ...

  5. 关于MFC框架程序中CWinApp::OnIdle

    很早之前就发现,我写的图形引擎在MFC框架程序中的刷帧率始终在60FPS左右.好在自己的程序对刷帧率的要求不是很高,所以一直没有太过纠结此事.直到今天看了别人的程序才发现应该在函数CWinApp::O ...

  6. MFC多线程详细讲解(转)

    一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX ...

  7. MFC中的CDC详细教程

    参考:  MFC中的CDC详细教程1,2,3 StretchDIBits用法

  8. MFC模态对话框程序不响应OnIdle

    从代码分析原因吧: OnIdle函数在MFC的CWinThread::Run函数中被调用,如下 // main running routine until thread exits int CWinT ...

  9. C++新手之详细介绍MFC

     MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对 ...

随机推荐

  1. HDU 5296 Annoying problem

    Annoying problem Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  2. 算法笔记_114:等额本金(Java)

    1 等额本金 标题:等额本金 小明从银行贷款3万元.约定分24个月,以等额本金方式还款. 这种还款方式就是把贷款额度等分到24个月.每个月除了要还固定的本金外,还要还贷款余额在一个月 中产生的利息. ...

  3. IntelliJ IDEA15,PhpStorm10,WebStorm11激活破解

    此方法可用于激活IntelliJ IDEA15,PhpStorm10,WebStorm11等系列JetBrains产品.仅供参考,请支持正版. 最新方法:http://15.idea.lanyus.c ...

  4. spring下载和安装

    下载和安装Spring请按例如以下步骤进行.   (1)登录网站,下载Spring的最新稳定版本号.最新版本号为spring-framework-4.0.建议下载spring-framework-sp ...

  5. object-c全局变量

    跟c++一定,在.m里Obj*obj=NULL,在.h里extern Obj*obj 即可.

  6. Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本

    Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本 1. 框架选型的要求1 1.1. 文档多1 1.2. 跨平台1 2. html解析器特性:1 2.1. j ...

  7. mysql 两列互转

    1.mysql 一张表两列互转 UPDATE tm_position as a,tm_position as b SET a.gps_longitude = b.gps_latitude,a.gps_ ...

  8. CCNA2.0笔记_子网划分

    http://files.cnblogs.com/files/airoot/%E5%AD%90%E7%BD%91%E5%88%92%E5%88%86.zip 网络 默认子网掩码 A类 255.0.0. ...

  9. Oracle连接远程数据库的四种设置方法

    Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍四种远程连接的方法和注意事项,并通过示例来说明,接下来我们就开始介绍 第一种方法: 若oracle服务器装在本机上,那就不多说了,连 ...

  10. jsp tag 直接文件实现

    引入 <%@ taglib prefix="sys" tagdir="/WEB-INF/tags/sys" %> 这里注意/WEB-INF/tags ...