Compartir a través de


CWinApp::OnIdle

Invalide esta función miembro para realizar el procesamiento del tiempo de inactividad.

virtual BOOL OnIdle( 
   LONG lCount  
);

Parámetros

  • lCount
    Un contador incrementa cada vez que se llama a OnIdle cuando la cola de mensajes de la aplicación está vacía. Este recuento se restablece en 0 cada vez que se procesa un nuevo mensaje. Puede utilizar el parámetro de lCount para determinar el tiempo relativa que la aplicación ha inactiva sin procesar un mensaje.

Valor devuelto

Distinto de cero para recibir más tiempo de procesamiento inactivo; 0 si no hay de tiempo de inactividad es necesario.

Comentarios

OnIdle se denomina en el bucle de mensajes predeterminado cuando la cola de mensajes de la aplicación está vacía. Override para llamar para formar tareas de marcha-controlador en segundo plano.

OnIdle debe devolver 0 para indicar que no se requiere ningún tiempo de procesamiento inactivo. Se incrementa el parámetro de lCount cada vez que se llama a OnIdle cuando la cola de mensajes está vacía y se restablece en 0 que un nuevo mensaje se procesa cada vez. Puede llamar a las diversas rutinas inactivas basadas en este recuento.

A continuación se resumen el procesamiento de bucles inactivos:

  1. Si el bucle de mensajes en la biblioteca Microsoft Foundation Class comprueba la cola de mensajes y no encuentra ningún mensaje pendiente, llama a OnIdle para el objeto de aplicación y proporciona 0 como argumento de lCount .

  2. OnIdle realiza algún procesamiento y devuelve un valor distinto de cero para indicar que debe llamar de nuevo para que la transformación posterior.

  3. Las comprobaciones de bucle de mensajes de la cola de mensajes de nuevo. Si no hay mensajes pendientes, llama a OnIdle de nuevo, aumentando el argumento de lCount .

  4. Finalmente, OnIdle termina de procesar todas sus tareas inactivas y devuelve 0. Esto indica al bucle de mensajes que detenga la nomenclatura de OnIdle hasta que el siguiente mensaje se recibe de la cola de mensajes, donde el punto el ciclo inactivo reinicia con el argumento establecido en 0.

No realice las tareas largas durante OnIdle porque la aplicación no puede procesar los datos proporcionados por el usuario hasta que OnIdle vuelva.

Nota

La implementación predeterminada de las actualizaciones de OnIdle dirige los objetos de la interfaz de usuario como elementos de menú y botones de la barra de herramientas, y realiza la limpieza interna de la estructura de datos.Por consiguiente, si invalida OnIdle, debe llamar a CWinApp::OnIdle con lCount en su versión invalidada.Primera llamada todo el procesamiento de la inactivo de la clase base (es decir, hasta la clase base OnIdle devuelve 0).Si debe realizar el trabajo antes de que el procesamiento de la clase base se complete, revise la implementación de la clase base para seleccionar lCount adecuado durante las que realizar el trabajo.

Si no desea OnIdle que se llamará cuando un mensaje se recupera de la cola de mensajes, puede reemplazar CWinThreadIsIdleMessage. Si una aplicación ha establecido un temporizador muy corto, o si el sistema está enviando el mensaje de WM_SYSTIMER , después OnIdle se llama repetidamente, y reduce el rendimiento.

Ejemplo

Los dos ejemplos siguientes se muestra cómo utilizar OnIdle. El primer ejemplo procesa dos tareas inactivas utilizando el argumento de lCount de dar prioridad a las tareas. La primera tarea es prioritaria, y debe hacer siempre que sea posible. La segunda tarea es menos importante y se hace cuando existe una pausa larga en datos proporcionados por el usuario. Observe la llamada a la versión de la clase base de OnIdle. El segundo ejemplo administra un grupo de tareas inactivas diversas prioridades.

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
}

Segundo ejemplo

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

Requisitos

encabezado: afxwin.h

Vea también

Referencia

CWinApp Class

Gráfico de jerarquías