Поделиться через


CWinApp::OnIdle

Переопределите этот функции-члена для выполнения обработки времени простоя.

virtual BOOL OnIdle( 
   LONG lCount  
);

Параметры

  • lCount
    Инкрементированный счетчик каждый раз OnIdle будет вызываются, когда очередь сообщений приложения пустой. Этот счетчик сбросить до 0 каждый раз, когда новое сообщение обрабатывается. Можно использовать параметр lCount для определения относительного время простоя приложение без обработки сообщения.

Возвращаемое значение

Ненулевой получить дополнительные неработающая время обработки; 0, если больше времени простоя не требуются.

Заметки

OnIdle вызываются по умолчанию в цикле сообщение, когда очередь сообщений приложения пустой. Используйте это переопределение, чтобы вызывать собственные задачи неактивен- обработчика фона.

OnIdle должно возвращать 0 для указания того, что неработающая время обработки нет необходимости. Параметр lCount увеличивается каждый раз, когда очередь сообщений OnIdle вызываются пуста и сбросить до 0 каждый раз, когда новое сообщение обрабатывается. Можно вызывать свои другие подпрограммы простоя, основанный на данном счетчике.

Следующее суммирует обработки неработающего цикла:

  1. Если цикл обработки сообщений в библиотеки Microsoft Foundation Class проверяет метки очередей сообщений и не обнаруживает ожидающих сообщений, то вызывается OnIdle для объекта приложения и передает 0 в качестве аргумента lCount.

  2. OnIdle выполняет некоторые обработки и передачи ненулевое значение для его отображения необходимо Вызываются, чтобы выполнить дальнейшую обработку.

  3. Проверяет цикла обработки сообщений очереди сообщений. Если сообщения не ожидание, то вызывается OnIdle снова, инкрементирующ аргумент lCount.

  4. Наконец, OnIdle завершает обработку всех его простоя задачи и возвращает 0. Это означает, что цикл обработки сообщений прекращается вызвать OnIdle до тех пор, пока не будет получено следующее сообщение из очереди сообщений, на которой точку бездействия цикл повторяется с аргумент установлен в значение 0.

Не выполняйте длинномерные задачи во время OnIdle поскольку приложение не может обрабатывать входные данные пользователя до тех пор, пока не будет возвращать OnIdle.

Примечание

Реализация по умолчанию обновлений OnIdle управляет объектами в качестве интерфейса пользователя и пункты меню кнопки панели инструментов и она выполняет внутреннюю очистку структуры данных.Поэтому при переопределении OnIdle, необходимо вызвать метод CWinApp::OnIdle с lCount в своей переопределенной версии.Первый вызов базового класса обработки бездействия (т е до базового класса OnIdle не вернет 0).Если требуется выполнить работу до завершения обработки базового класса, просмотрите реализацию базового класса для выбора правильного lCount, в течение которого сделать работу.

Если не нужно OnIdle вызываться, когда сообщение восстановлено из очереди сообщений, можно переопределить CWinThreadIsIdleMessage. Если приложение отражаемого очень короткий таймера или если система отправляет сообщение WM_SYSTIMER, то OnIdle будет повторно вызываются и снижает производительность.

Пример

Следующие 2 примера показано, как использовать OnIdle. Первый пример считает 2 неактивных задач с помощью аргумента lCount назначить приоритет задачи. Первая задача - самый важный, и необходимо сделать ее, если возможно. Вторая задача менее важна и должна быть создана только в случае, если долго приостановить на входе пользователя. Обратите внимание на вызов базового класса OnIdle версии. Во втором примере управляет группа в составе задачи простоя с различными приоритетами.

BOOL CMyApp::OnIdle(LONG lCount)
{
   BOOL bMore = CWinApp::OnIdle(lCount);

   if (lCount == 0)
   {
      TRACE(_T("App idle for short period of time\n"));
      bMore = TRUE;
   }
   else if (lCount == 10)
   {
      TRACE(_T("App idle for longer amount of time\n"));
      bMore = TRUE;
   }
   else if (lCount == 100)
   {
      TRACE(_T("App idle for even longer amount of time\n"));
      bMore = TRUE;
   }
   else if (lCount == 1000)
   {
      TRACE(_T("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 are any more idle tasks
}

Второй пример

// 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 CMyWinApp::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 TRUE;
}

Требования

Header: afxwin.h

См. также

Ссылки

Класс CWinApp

Диаграмма иерархии