Compartir a través de


Procesamiento de bucles inactivos

Muchas aplicaciones llevan a cabo un procesamiento largo "en segundo plano". A veces, las consideraciones de rendimiento dictan el uso de multithreading para dicho trabajo. Los subprocesos implican una sobrecarga de desarrollo adicional, por lo que no se recomiendan para tareas sencillas como el trabajo en tiempo de inactividad que MFC hace en la función OnIdle. Este artículo se centra en el procesamiento en inactividad. Para más información sobre multithreading, consulte Temas de multithreading.

Algunos tipos de procesamiento en segundo plano se realizan correctamente durante los intervalos en los que el usuario no interactúa con la aplicación. En una aplicación desarrollada para el sistema operativo Microsoft Windows, una aplicación puede realizar el procesamiento en tiempo de inactividad dividiendo un proceso largo en muchos fragmentos pequeños. Después de procesar cada fragmento, la aplicación cede el control de la ejecución a Windows mediante un bucle PeekMessage.

En este artículo, se explican dos maneras de realizar el procesamiento en inactividad en la aplicación:

  • Con PeekMessage en el bucle principal de mensajes de MFC.

  • Mediante la inserción de otro bucle PeekMessage en otro lugar de la aplicación.

PeekMessage en el bucle de mensajes MFC

En una aplicación desarrollada con MFC, el bucle de mensajes principal de la clase CWinThread contiene un bucle de mensajes que llama a la API Win32 PeekMessage. Este bucle también llama a la función miembro OnIdle de CWinThread entre mensajes. Una aplicación puede procesar mensajes en este tiempo de inactividad invalidando la función OnIdle.

Nota:

Run, OnIdle y otras funciones miembro determinadas ahora son miembros de la clase CWinThread en lugar de la clase CWinApp. La clase CWinApp se deriva de la clase CWinThread.

Para más información sobre cómo llevar a cabo el procesamiento en inactividad, consulte OnIdle en la Referencia de MFC.

PeekMessage en otra parte de la aplicación

Otro método para realizar el procesamiento en inactividad en una aplicación implica insertar un bucle de mensajes en una de las funciones. Este bucle de mensajes es muy similar al bucle de mensajes principal de MFC que se encuentra en CWinThread::Run. Esto significa que este bucle en una aplicación desarrollada con MFC debe realizar muchas de las mismas funciones que el bucle de mensajes principal. En el fragmento de código siguiente, se muestra cómo escribir un bucle de mensajes compatible con MFC:

BOOL bDoingBackgroundProcessing = TRUE;
while (bDoingBackgroundProcessing)
{
   MSG msg;
   while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
   {
      if (!AfxGetApp()->PumpMessage())
      {
         bDoingBackgroundProcessing = FALSE;
         ::PostQuitMessage(0);
         break;
      }
   }
   // let MFC do its idle processing
   LONG lIdle = 0;
   while (AfxGetApp()->OnIdle(lIdle++))
      ;
   // Perform some background processing here 
   // using another call to OnIdle
}

Este código, insertado en una función, recorre en bucle siempre que haya un procesamiento en inactividad por hacer. Dentro de ese bucle, un bucle anidado llama repetidamente a PeekMessage. Siempre que esa llamada devuelva un valor distinto de cero, el bucle llama a CWinThread::PumpMessage para realizar la traducción y la distribución de mensajes normales. Aunque PumpMessage no está documentado, puede examinar su código fuente en el archivo ThrdCore.Cpp en el directorio \atlmfc\src\mfc de la instalación de Visual C++.

Una vez que finaliza el bucle interno, el bucle externo realiza el procesamiento en inactividad con una o más llamadas a OnIdle. La primera llamada es para fines de MFC. Puede hacer llamadas adicionales a OnIdle para realizar su propio trabajo en segundo plano.

Para más información sobre cómo llevar a cabo el procesamiento en inactividad, consulte OnIdle en la referencia de la biblioteca MFC.

Consulte también

Temas generales de MFC