【转】MFC OnIdle的详细说明

转载出处: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 == 0)
  {
    TRACE("App idle for short period of time/n");
    bMore = TRUE;
  }
  else if (lCount == 10)
  {
  TRACE("App idle for longer amount of time/n");
  bMore = TRUE;
  }
  else if (lCount == 100)
  {
    TRACE("App idle for even longer amount of time/n");
    bMore = TRUE;
  }
  else if (lCount == 1000)
  {
    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;
}

时间: 2024-08-04 12:38:52

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

MFC?VCL?

最近网上争论VC和DELPHI/BCB优劣的朋友甚多(其实不是最近,一直都很多),其实真正有分歧的多半在MFC和VCL两套类库的选择上.不知道诸位对这两套类库,或者说是Application Framework(下面简称AF)的理解究竟如何? 对于一套AF,跟一套类库class library最大的不同,在于它是一套完整的已经构建好的框架,风格.结构都已经做好,你不得不去遵守,而类库讲究的是拿来主义,理想的境界应该是可装配的元件(Component),比如标准模板库STL就是一个最后的例证.AF

C++新手之详细介绍MFC

我们都知道MFC是C++类库,本文详细介绍C++的这个类库,适合初学者阅读,希望对你有帮助,一起来看. MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法. 因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓. Microsoft

MFC常用的类详细介绍

常用的MFC类 CRuntimeClass结构 在CRuntimeClass结构中定义了类名.对象所占存储空间的大小.类的版本号等成员变量及动态创建对象.派生关系判断等成员函数.每一个从CObject类派生的类都有一个CRuntimeClass结构同它关联,以便完成在运行时得到对象的信息或基类的信息. 要使用CRuntimeClass结构,必须结合使用RUNTIME_CLASS()宏和其他有关运行时类型识别的MFC宏. CObject类 MFC的CObject类为程序员提供了对象诊断.运行时类型

关于MFC控件删除出现“具有该ID的控件已存在”这样的情况的解决方案,详细,网上都没有这么详细的,我是“深受其害”,所以想将详细的方法分享出去。

网上关于MFC控件删除出现“具有该ID的控件已存在”这样的情况,在网上找了很多关于这方面的东西,但是都不是很全,也不容易弄明白.现在问我直接通过一个项目和图片的形式和大家一块分享一个这个解决方法(如有不对,请相互学习,qq1035169610): 1.创建一个MFC的项目,这里仅限于演示,就把项目名字称为“lu”吧. 2.下面就是将button控件添加到图形界面框中.结果如下: 3.只要将控件拉入到图形界面中,在Resource.h这个文件中创建宏,如下图所示: 4.那么开始改控件的名字和ID.

MFC窗口风格 WS_style/WS_EX_style(超详细)

窗口风格(Window style) WS_BORDER   有边框窗口 WS_CAPTION   必须和WS_BORDER风格配合,但不能与WS_DLGFRAME风格一起使用.指示窗口包含标题要部分. WS_CHILD   说明窗口为子窗口,不能应用于弹出式窗口风格(WS_POPUP). WS_CHILDWINDOW   同WS_CHILD. WS_CLIPCHILDREN   绘制父窗口时,不绘制子窗口的裁剪区域.使用在建立父窗口时. WS_CLIPSIBLINGS 剪裁相关的子窗口,这意味

MFC中CString.Format的详细用法

CString 是一个类,这个类是MFC众多类中的一个.这个类有个函数叫Format,这个函数的作用是数据格式转换. Format可以转换的格式字符:(就是说将其他格式的数据类型 转换为CString类型的) %c                 单个字符 %d                 十进制整数(int) %ld                十进制整数(long) %f                 十进制浮点数(float) %lf                十进制浮点数(d

C++ MFC Tab Control控件的详细使用

1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish.?2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置ID为IDC_TABTEST 在More Styles里勾上Bottom. 调速尺寸使其布满整个对话框, 我这边Tab Control的尺寸最后为164X203. 在ClassWizard为其添加变量, 变量名为m_tab. 类型为CTabCtrl.?3. 在对话框的初始化函数OnInitDialog

MFC DLL封装窗体详细步骤

一.封装 1. File->Projects->MFC DLL->输入RegularDLL;2. 选择"MFC扩展DLL" 3. 选择ResourceView视图,再RegularDLL resource目录上右键单击->Insert-> Dialog->New 4. 新窗体删除OK和Cancel,新建一个按钮,窗体的ID改为:IDD_DLL_DIALOG,按钮的ID改为:IDC_HELLO_BUTTON 5. 双击新建的按钮->ok创建新类-

【OpenCV】【MFC】图片、视频、摄像头输入响应【详细图解】

记住新建项目后,要配置OpenCV环境!参考链接http://blog.csdn.net/zy122121cs/article/details/49180541 做工程搭建框架什么的,基本的要熟练啊.    其中借鉴了ww老师的代码~ 新建项目,命名: 点确定,然后,我习惯用基于对话框的:然后点击完成. 从工具箱拖几个控件出来:    Combo Box组合框属性设置: 给图片随便命名个ID: 如右图所示,框架就搭好了:   在Test01Dlg.h头文件中添加如下: //包含Opencv库函数