Gestion des boucles inactives
De nombreuses applications effectuent le traitement long « en arrière-plan ». Parfois des considérations sur les performances dictent vous utilisez le multithreading pour un tel travail.Les threads impliquent la charge mémoire supplémentaire de développement, ils ne sont pas recommandés pour les tâches simples comme du travail pendant des temps d'inactivité que MFC fait dans la fonction d' OnIdle .Cet article se concentre sur le traitement des temps d'inactivité.Pour plus d'informations sur le multithreading, consultez Rubriques de multithreading.
Certains genres de traitement en arrière-plan sont autrement effectués pendant les intervalles que l'utilisateur n'interagit pas autrement avec l'application.Dans une application développée de système d'exploitation Microsoft Windows, une application peut effectuer traitement des temps d'inactivité en fractionnant un processus long dans de nombreux petits fragments.Après traitement chaque fragment, le contrôle d'exécution de produit d'application windows à l'aide d'une boucle de PeekMessage .
Cet article décrit deux façons d'effectuer le traitement des temps d'inactivité dans votre application :
À l'aide de PeekMessage de la boucle de message principale MFC.
Incorporant une autre boucle de PeekMessage ailleurs dans l'application.
PeekMessage de la boucle de messages MFC
Dans une application développée avec MFC, la boucle de message principale dans la classe d' CWinThread contient une boucle de messages qui appelle l'API Win32 de PeekMessage .Cette boucle appelle également la fonction membre d' OnIdle d' CWinThread entre les messages.Une application peut traiter les messages dans cette durée d'inactivité en substituant la fonction d' OnIdle .
[!REMARQUE]
Exécuter, OnIdle, et certaines autres fonctions membres sont maintenant des membres de classe CWinThread plutôt que de classe CWinApp.CWinApp est dérivé de CWinThread.
Pour plus d'informations sur effectuer le traitement des temps d'inactivité, consultez l' OnIdle dans MFC Reference.
PeekMessage ailleurs dans votre application
Une autre méthode pour effectuer le traitement des temps d'inactivité dans une application implique incorporer une boucle de message dans l'une de vos fonctions.Cette boucle de message est très similaire à la boucle de message principale MFC, a trouvé dans CWinThread::Run.Cela signifie qu'une telle boucle dans une application développée avec MFC doit satisfaire plusieurs des mêmes fonctions que la boucle de message principale.Le fragment de code suivant montre comment écrire une boucle de message compatible avec 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
}
Ce code, incorporé dans une fonction, boucle tant qu'il existe de traitement des temps d'inactivité à effectuer.Dans cette boucle, une boucle imbriquée appelle plusieurs PeekMessage.Tant que cet appel retourne une valeur différente de zéro, la boucle appelle CWinThread::PumpMessage pour exécuter la traduction et distribuer normales de message.Bien qu' PumpMessage soit non documenté, vous pouvez examiner son code source dans le fichier de ThrdCore.Cpp à l'installation de \atlmfc\src\mfc directory of your Visual C C/C++.
Une fois la boucle interne se termine, la boucle externe exécute le traitement des temps d'inactivité avec un ou plusieurs appels à OnIdle.Le premier appel est pour MFC.Vous pouvez effectuer des appels supplémentaires à OnIdle pour exécuter votre propre travail d'arrière-plan.
Pour plus d'informations sur effectuer le traitement des temps d'inactivité, consultez l' OnIdle dans la référence de la bibliothèque MFC.