Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Många program utför lång bearbetning "i bakgrunden". Ibland avgör prestandaöverväganden att använda multitrådning för sådant arbete. Trådar innebär extra utvecklingskostnader, så de rekommenderas inte för enkla uppgifter som det inaktiva arbete som MFC utför i OnIdle-funktionen . Den här artikeln fokuserar på inaktiv bearbetning. Mer information om multitrådning finns i Ämnen för flertrådning.
Vissa typer av bakgrundsbearbetning utförs korrekt under intervall som användaren annars inte interagerar med programmet. I ett program som utvecklats för Microsoft Windows-operativsystemet kan ett program utföra bearbetning på inaktiv tid genom att dela upp en lång process i många små fragment. Efter bearbetningen av varje fragment ger programmet körningskontroll till Windows med hjälp av en PeekMessage-loop .
Den här artikeln beskriver två sätt att utföra inaktiv bearbetning i ditt program:
Använda PeekMessage i MFC:s huvudmeddelandeslinga.
Bädda in en annan PeekMessage-loop någon annanstans i programmet.
PeekMessage i MFC-meddelandeloopen
I ett program som utvecklats med MFC innehåller huvudmeddelandeloopen CWinThread i klassen en meddelandeloop som anropar PeekMessage Win32-API:et. Den här loopen anropar också medlemsfunktionen OnIdle för CWinThread mellan meddelanden. Ett program kan bearbeta meddelanden i den här inaktiva tiden genom att OnIdle åsidosätta funktionen.
Anmärkning
Run, OnIdle, och vissa andra medlemsfunktioner är nu medlemmar i klassen CWinThread i stället för för klassen CWinApp.
CWinApp härleds från CWinThread.
Mer information om hur du utför inaktiv bearbetning finns i OnIdle i MFC-referensen.
PeekMessage någon annanstans i ditt program
En annan metod för att utföra inaktiv bearbetning i ett program är att bädda in en meddelandeloop i en av dina funktioner. Den här meddelandeloopen liknar MFC:s huvudmeddelandeslinga i CWinThread::Run. Det innebär att en sådan loop i ett program som utvecklats med MFC måste utföra många av samma funktioner som huvudmeddelandeloopen. Följande kodfragment visar hur du skriver en meddelandeloop som är kompatibel med 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
}
Den här koden, inbäddad i en funktion, loopar så länge det finns inaktiv bearbetning att göra. Inom den loopen anropar en kapslad loop PeekMessage upprepade gånger. Så länge anropet returnerar ett icke-nollvärde anropar CWinThread::PumpMessage loopen för att utföra normal meddelandeöversättning och sändning. Även om PumpMessage är odokumenterad kan du undersöka källkoden i filen ThrdCore.Cpp i katalogen \atlmfc\src\mfc i din Visual C++-installation.
När den inre loopen är slut utför den yttre loopen inaktiv bearbetning med ett eller flera anrop till OnIdle. Det första samtalet är för MFC:s syften. Du kan göra ytterligare anrop till OnIdle för att utföra ditt eget bakgrundsarbete.
Mer information om hur du utför inaktiv bearbetning finns i OnIdle i MFC-biblioteksreferensen.