traitement des boucles inactives
De nombreuses applications effectuent le traitement lent « en arrière-plan. » Parfois des performances dictent l'aide du multithreading pour ce travail. Les threads impliquent la charge mémoire de développement, ils ne sont pas recommandés pour les tâches simples comme le travail avec des temps d'inactivité que MFC fait dans la fonction OnIdle. Cet article se concentre sur le traitement des temps d'inactivité. Pour plus d'informations sur le multithreading, consultez Multithreading Topics.
Certains types de traitement en arrière-plan sont correctement effectués pendant les intervalles où l'utilisateur n'interagit pas avec l'application. Dans une application développée pour le système d'exploitation Microsoft Windows, une application peut effectuer le traitement en tant les temps d'inactivité en divisant un processus longue à de nombreux petits fragments. Après avoir traité chaque fragment, l'application réalise la commande d'exécution de Windows en utilisant une boucle PeekMessage.
Cet article décrit deux méthodes pour effectuer le traitement du temps d'inactivité dans votre application :
Utilisation de PeekMessage dans la boucle de message principale de MFC.
Incorporant d'une autre boucle PeekMessage ailleurs dans l'application.
PeekMessage de la boucle de message de MFC
Dans une application développée avec MFC, la boucle de message clé dans la classe CWinThread contient une boucle de message qui appelle l'API Win32 PeekMessage. Cette boucle appelle également la fonction membre OnIdle de CWinThread entre les messages. Une application peut traiter les messages dans cette durée d'inactivité en éditant la fonction OnIdle.
Notes
Exécuter, OnIdle, et certains autres fonctions membres sont désormais des membres de la classe CWinThread au lieu de la classe CWinApp.CWinApp est dérivé de CWinThread.
Pour plus d'informations sur la manière d'effectuer le traitement du temps d'inactivité, consultez OnIdle dans le guide de MFC.
PeekMessage ailleurs dans votre application
Une autre méthode pour effectuer le traitement du temps d'inactivité d'une application implique l'incorporation d'une boucle de message dans une de vos fonctions. Cette boucle de message est très similaire à la boucle de message principale de MFC, trouvé dans CWinThread::Run. Cela signifie que cette boucle dans une application développée avec MFC doit exécuter de nombreuses 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, une boucle aussi longtemps qu'il restera de temps d'inactivité à effectuer. Dans cette boucle, une boucle imbriquée est appelée à plusieurs reprises PeekMessage. Comme cet appel retourne une valeur différente de zéro, la boucle appelle CWinThread::PumpMessage pour exécuter la traduction et de distribuer standard de message. Bien que PumpMessage soit non documenté, vous pouvez examiner son code source dans le fichier de ThrdCore.Cpp dans le répertoire d'atlmfc\src\cpc de l'installation de Visual C++.
Une fois que la boucle interne se termine, la boucle externe effectue le traitement des temps d'inactivité à un ou plusieurs appels à OnIdle. Le premier appel à MFC. Vous pouvez effectuer des appels supplémentaires à OnIdle pour effectuer votre propre travail en arrière-plan.
Pour plus d'informations sur la manière d'effectuer le traitement du temps d'inactivité, consultez OnIdle dans la référence de bibliothèque de MFC.