OnIdle的处理

转载 2004年08月23日 18:48:00

Remarks
Override this method to perform idle-time processing. OnIdle is called in the default message loop when the message queue in the application is empty. Use your override to call your own background idle-handler tasks.

OnIdle should return 0 to indicate that no idle processing time is required. The lCount parameter is incremented each time OnIdle is called when the message queue is empty and resets to 0 each time a new message is processed. You can call your different idle routines based on this count.

The following summarizes idle loop processing:

If the message loop in the Microsoft Foundation Class Library checks the message queue and finds no pending messages, it calls OnIdle for the application object and supplies 0 as the lCount argument.
OnIdle performs some processing and returns a nonzero value to indicate it should be called again to do further processing.
The message loop checks the message queue again. If no messages are pending, it calls OnIdle again, incrementing the lCount argument.
Eventually, OnIdle finishes processing all its idle tasks and returns 0. This tells the message loop to stop calling OnIdle until the next message is received from the message queue, at which point the idle cycle restarts with the argument set to zero.
Do not perform lengthy tasks during OnIdle because your application cannot process user input until OnIdle returns.

The default implementation of OnIdle updates command user-interface objects such as menu items and toolbar buttons, and it performs internal data structure cleanup. Therefore, if you override OnIdle, you must call CWinApp::OnIdle with the lCount in your overridden version. First call all base-class idle processing, that is, until the base class OnIdle returns 0. If you need to perform work before the base-class processing completes, review the base-class implementation to select the proper lCount during which to do your work.

If you do not want OnIdle to be called whenever a message is retrieved from the message queue, you can override the CWinThread::IsIdleMessage. If an application has set a very short timer, or if the system is sending the WM_SYSTIMER message, then OnIdle will be called repeatedly, and degrade performance.

Example
The following two examples show how to use OnIdle. The first example processes two idle tasks using the lCount argument to prioritize the tasks. The first task is high priority, and you should do it whenever possible. The second task is less important and should be done only when there is a long pause in user input. Note the call to the base-class version of OnIdle. The second example manages a group of idle tasks with different priorities.

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 is not set to TRUE, no longer need idle.
     // IMPORTANT: bMore is not set to FALSE since CWinApp::OnIdle may
     // have more idle tasks to complete.
    }

    return bMore;
     // Return TRUE as long as there is any more idle tasks.
}

Second Example
// In this example, four idle loop tasks are given various
// opportunities to run:
// Task1 is always given a chance to run during idle time, provided
//   that no message has queued up while the framework was processing
//   its own idle loop tasks (at lCount levels 0 and 1).
// Task2 is given a chance to run only if Task1 has already run,
//   provided that no message has queued up while Task1 was running.
// Task3 and Task4 are given a chance to run only if both Task1 and
//   Task2 have already run, and no message has queued up in the mean
//   time.  If Task3 gets its chance to run, then Task4 always gets
//   a chance to run immediately after Task3.

BOOL CMyApp::OnIdle(LONG lCount)
{
   // In this example, as in most applications, you should let the
   // base class CWinApp::OnIdle complete its processing before you
   // attempt any additional idle loop processing.
   if (CWinApp::OnIdle(lCount))
      return TRUE;  

   // The base class CWinApp::OnIdle reserves the lCount values 0
   // and 1 for the framework's own idle processing.   If you wish to
   // share idle processing time at a peer level with the framework,
   // then replace the above if-statement with a straight call to
   // CWinApp::OnIdle; and then add a case statement for lCount value
   // 0 and/or 1. Study the base class implementation first to
   // understand how your idle loop tasks will compete with the
   // framework's idle loop processing.

   switch (lCount)
   {
      case 2:
         Task1();
         return TRUE; // Next time give Task2 a chance.
      case 3:
         Task2();
         return TRUE; // Next time give Task3 and Task4 a chance.
      case 4:
         Task3();
         Task4();
         return FALSE; // Cycle through the idle loop tasks again.
   }
   return FALSE;
}

OnIdle的详细说明

CWinApp::OnIdlevirtual BOOL OnIdle( LONG lCount );返回值:如果要接收更多的空闲处理时间,则返回非零值;如果不需要更多的空闲时间则返回0。参数:lCou...
  • tsing_best
  • tsing_best
  • 2014年05月05日 15:46
  • 462

MFC框架程序中OnIdle

先看下MSDN对OnIdle()介绍: CWinApp::OnIdle OnIdle is called in the default message loop when the applicat...
  • lcjwxd
  • lcjwxd
  • 2014年04月01日 13:38
  • 616

MFC框架程序中OnIdle

MFC框架程序中OnIdle 功能应用于:场景编辑器中,讲renderOneFrame与UI响应区分 文章转载自:http://www.cnblogs.com/kex1n/archive/...
  • liminled
  • liminled
  • 2015年04月14日 13:53
  • 629

MFC框架程序中OnIdle

【转自:http://www.cnblogs.com/kex1n/archive/2012/03/02/2377621.html】 先看下MSDN对OnIdle()介绍: CWinApp::OnId...
  • skywalker_leo
  • skywalker_leo
  • 2015年02月03日 11:44
  • 637

MFC OnIdle函数学习

先看下MSDN对OnIdle()介绍:CWinApp::OnIdleOnIdle is called in the default message loop when the application’...
  • smallmount123
  • smallmount123
  • 2016年04月06日 22:58
  • 367

MFC框架程序中OnIdle的介绍

MFC框架程序中OnIdle的介绍 先看下MSDN对OnIdle()介绍: CWinApp::OnIdle OnIdle is called in the default message...
  • u012354381
  • u012354381
  • 2013年10月31日 18:16
  • 355

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

从代码分析原因吧:   OnIdle函数在MFC的CWinThread::Run函数中被调用,如下 // main running routine until thread exits int CW...
  • s634772208
  • s634772208
  • 2017年04月04日 21:03
  • 401

Asp.net 一般处理程序+扩展

最近,在做项目的过程中,用到了很多的一般处理程序,相信你也用到了,但是你真的了解它吗? 介绍:                             一般处理程序的一般是相对于aspx页面来说的...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014年01月24日 09:51
  • 8486

如何学好图像处理——从小白到大神?

说起图像处理,你会想到什么?你是否真的了解这个领域所研究的内容。如果你还苦于自己总是在门外徘徊而无法入门,本文将给你一些建议和一些学习资源...
  • baimafujinji
  • baimafujinji
  • 2016年02月26日 17:48
  • 33179

机器学习, 自然语言处理, 和图像识别 很不错的行业嘛

1) 机器学习, 自然语言处理, 和图像识别  现有数据科学家团队都具有博士背景,且有美国和英国留学经历, 但我们欢迎非博士和非海外背景的人才。  2) 安卓 android 开发  现有...
  • SoulsCarrier
  • SoulsCarrier
  • 2015年02月25日 09:45
  • 973
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OnIdle的处理
举报原因:
原因补充:

(最多只允许输入30个字)