Procesamiento de bucles inactivos
Muchas aplicaciones realizan el procesamiento largo “en segundo plano”. Las consideraciones de rendimiento dictan a veces con multithreading para este tipo de trabajo.Los subprocesos la sobrecarga adicional implican ellas de desarrollo, por lo que no se recomienda para las tareas simples como el tiempo de inactividad que MFC hace en la función de OnIdle .En este artículo se centra en el procesamiento inactivo.Para obtener más información sobre multithreading, vea Temas de multithreading.
Algunas clases de procesamiento en segundo plano son correctamente realiza durante intervalos que el usuario no está interactuando de otra manera con la aplicación.En una aplicación desarrollada para el sistema operativo Microsoft Windows, una aplicación puede realizar el procesamiento del tiempo de inactividad dividiendo un proceso largo en muchos pequeños fragmentos.Después de procesar cada fragmento, la aplicación hace que el control de ejecución a Windows mediante un bucle de PeekMessage .
En este artículo se explica dos maneras de hacer el procesamiento inactivo en su aplicación:
Mediante PeekMessage en el bucle principal de MFC.
Insertar otro bucle de PeekMessage en alguna otra parte de la aplicación.
PeekMessage en el bucle de mensajes MFC
En una aplicación desarrollada con MFC, el bucle principal en la clase de CWinThread contiene un bucle de mensajes que llame a la API Win32 de PeekMessage .Este bucle también llama a la función miembro de OnIdle de CWinThread entre los mensajes.Una aplicación puede procesar mensajes en este tiempo de inactividad reemplazando la función de OnIdle .
[!NOTA]
Ejecutar, OnIdle, y que otras funciones miembro ahora son miembros de la clase CWinThread en lugar de clase CWinApp.CWinApp se deriva de CWinThread.
Para obtener más información sobre cómo realizar el procesamiento inactivo, vea OnIdle en la referencia de MFC.
PeekMessage Elsewhere en la aplicación
Otro método para realizar el procesamiento inactivo en una aplicación implica la inserción de un bucle de mensajes en una de sus funciones.Este bucle de mensajes es muy similar al bucle principal de MFC, que se encuentra en CWinThread::Run.Eso significa que este bucle en una aplicación desarrollada con MFC debe realizar muchas de las mismas funciones que el bucle principal.El fragmento de código siguiente muestra la escritura de 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, incrustado en una función, bucles mientras haya procesamiento inactivo a hacer.Dentro del bucle, un bucle anidado llama repetidamente PeekMessage.Siempre que esa llamada devuelve un valor distinto de cero, el bucle llama CWinThread::PumpMessage para realizar la traducción normal y enviar el mensaje.Aunque PumpMessage es indocumentado, puede examinar el código fuente en el archivo de ThrdCore.Cpp en \ directorio de atlmfc \ src \ MFC de la instalación de Visual C++.
Una vez finaliza internos del bucle, el bucle exterior realizan el procesamiento inactivo con una o más llamadas a OnIdle.La primera llamada es para fines de MFC.Puede realizar llamadas adicionales a OnIdle para hacer su propio trabajo de fondo.
Para obtener más información sobre cómo realizar el procesamiento inactivo, vea OnIdle en la referencia de la biblioteca MFC.