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;
}

时间: 2024-12-28 12:59:05

CWinApp::OnIdle 的使用方法的相关文章

【转】MFC OnIdle的详细说明

转载出处:http://blog.csdn.net/tsing_best/article/details/25055707 CWinApp::OnIdlevirtual BOOL OnIdle( LONG lCount );返回值: 如果要接收更多的空闲处理时间,则返回非零值:如果不需要更多的空闲时间则返回0.参数: lCount 该参数是一个计数值,当应用程序的消息队列为空,OnIdle函数被调用时,该计数值就增加1. 每当一条新消息被处理时,该计数值就被复位为0.你可以使用lCount参数来

动态链接库开发说明

目 录 第1章 基本概念    1 1.1 一个简单的例子    1 1.1.1 新建一个VC++项目    1 1.1.2 添加源文件    3 1.1.3 输入源代码    6 1.1.4 __declspec(dllexport)    7 1.1.5 WINAPI    7 1.1.6 导出符号    7 1.1.7 DEF文件    8 1.2 调用动态库    9 1.2.1 隐式链接    9 1.2.2 显式链接    10 1.3 导出数据    11 1.3.1 隐式链接  

Meandering Through the Maze of MFC Message and Command Routing

Meandering Through the Maze of MFC Message and Command Routing Paul DiLascia Paul DiLascia is a freelance software consultant specializing in developing C++ applications for Windows. He is the author of Windows++: Writing Reusable Code in C++ (Addiso

MFC- OnIdle空闲处理

CWinApp::OnIdlevirtual BOOL OnIdle( LONG lCount );返回值: 如果要接收更多的空闲处理时间,则返回非零值:如果不需要更多的空闲时间则返回0.参数: lCount 该参数是一个计数值,当应用程序的消息队列为空,OnIdle函数被调用时,该计数值就增加1. 每当一条新消息被处理时,该计数值就被复位为0.你可以使用lCount参数来确定应用程序不处理消息时空闲时间的相对长度.说明: 重载CWinApp::OnIdle()时,不要忘记要先调用CWinApp

[MFC美化] USkin使用详解-使用方法

该种皮肤库资料很少,用法与前面几种类似. 它主要有:USkin.dll ,USkin.lib,USkin.h和Sakura.msstyles这四个文件.皮肤格式是.u3.SkinBuilder是USkin界面换肤软件.u3文件制作环境 . 以下是摸索出来的用法,如有错误请指正. 一.使用方法 1. 将这四个文件拷贝至相应文件夹下..lib和.h放在工程文件夹,.dll和Sakura.msstyles放到debug文件夹下. 2. 在工程stdafx.h文件中加入USkin.h和USkin.lib

vc++加载透明png图片方法——GDI+和CImage两种

vc++加载透明png图片方法——GDI+和CImage两种 在加载png时遇到了麻烦,后来用了两个方法解决了.一个是用GDI+,另外就是用vs.net MFC自带的CImage. 先看看GDI+的方法 方法1: 1.GDI+画透明图层(alpha)的png图片 stdafx加入如下: #include <comdef.h>//初始化一下com口 #include "GdiPlus.h" using namespace Gdiplus; #pragma comment(li

VC 对话框背景颜色、控件颜色(三种方法)

系统环境:Windows 7软件环境:Visual C++ 2008 SP1本次目的:为对话框设置背景颜色.控件颜色 既然MFC对话框不好开发,那么现在我们来开始美化我们的对话框.为对话框设置背景颜色.控件颜色等等. 对话框背景颜色: 网上流传有四种方法(可能还不止),在VC++2008SP1测试后,发现只有三种可以使用了,其中第一种被废弃了.以下是四种方法: 方法一 (失效):调用CWinApp类的成员函数SetDialogBkColor来实现.       其中函数的第一个参数指定了背景颜色

在MFC中用WriteProfileInt等方法保存应用程序配置

0.简介 CWinApp类中提供了一组用于读写应用程序配置的方法: GetProfileInt WriteProfileInt GetProfileString WriteProfileString 可方便的用于读写应用程序配置. 1.关于CWinApp::SetRegistryKey方法 用VC++的向导建立MFC项目之后,在InitInstance中可以看到这样的语句: SetRegistryKey(_T("应用程序向导生成的本地应用程序")); 该函数将为以上提到的几个方法建立工

MFC框架类、文档类、视图类相互访问的方法

1.获取应用程序指针 CMyApp* pApp=(CMyApp*)AfxGetApp(); 2.获取主框架指针 CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针 CMainFrame* pMainFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd); 或者 CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd(); 3.获取菜单指针 CMenu* pMenu = AfxGetMain