Elaborazione di cicli inattivi
Molte applicazioni eseguono un'elaborazione lunga "in background". In alcuni casi, le considerazioni sulle prestazioni determinano l'uso del multithreading per questo tipo di lavoro. I thread comportano un sovraccarico di sviluppo aggiuntivo, quindi non sono consigliati per attività semplici come il lavoro inattiva eseguito da MFC nella funzione OnIdle . Questo articolo è incentrato sull'elaborazione inattiva. Per altre informazioni sul multithreading, vedere Argomenti relativi al multithreading.
Alcuni tipi di elaborazione in background vengono eseguiti in modo appropriato durante gli intervalli in cui l'utente non interagisce altrimenti con l'applicazione. In un'applicazione sviluppata per il sistema operativo Microsoft Windows, un'applicazione può eseguire l'elaborazione inattiva suddividendo un processo lungo in molti piccoli frammenti. Dopo l'elaborazione di ogni frammento, l'applicazione restituisce il controllo di esecuzione a Windows usando un ciclo PeekMessage .
Questo articolo illustra due modi per eseguire l'elaborazione inattiva nell'applicazione:
Uso di PeekMessage nel ciclo di messaggi principale di MFC.
Incorporamento di un altro ciclo PeekMessage in un'altra posizione nell'applicazione.
PeekMessage nel ciclo di messaggi MFC
In un'applicazione sviluppata con MFC, il ciclo di messaggi principale nella CWinThread
classe contiene un ciclo di messaggi che chiama l'API Win32 PeekMessage . Questo ciclo chiama anche la OnIdle
funzione membro di CWinThread
tra i messaggi. Un'applicazione può elaborare i messaggi in questo tempo di inattività eseguendo l'override della OnIdle
funzione.
Nota
Run
, OnIdle
e alcune altre funzioni membro sono ora membri della classe CWinThread
anziché della classe CWinApp
. L'oggetto CWinApp
è derivato da CWinThread
.
Per altre informazioni sull'esecuzione dell'elaborazione inattiva, vedere OnIdle nella Guida di riferimento per MFC.
PeekMessage altrove nell'applicazione
Un altro metodo per eseguire l'elaborazione inattiva in un'applicazione comporta l'incorporamento di un ciclo di messaggi in una delle funzioni. Questo ciclo di messaggi è molto simile al ciclo di messaggi principale di MFC, disponibile in CWinThread::Run. Ciò significa che un ciclo di questo tipo in un'applicazione sviluppata con MFC deve eseguire molte delle stesse funzioni del ciclo di messaggi principale. Il frammento di codice seguente illustra la scrittura di un ciclo di messaggi compatibile 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
}
Questo codice, incorporato in una funzione, esegue un ciclo purché sia presente un'elaborazione inattiva da eseguire. All'interno di tale ciclo un ciclo annidato chiama PeekMessage
ripetutamente . Purché tale chiamata restituisca un valore diverso da zero, il ciclo chiama CWinThread::PumpMessage
per eseguire la normale conversione e l'invio di messaggi. Anche se PumpMessage
non è documentato, è possibile esaminarne il codice sorgente nel file ThrdCore.Cpp nella directory \atlmfc\src\mfc dell'installazione di Visual C++.
Al termine del ciclo interno, il ciclo esterno esegue l'elaborazione inattiva con una o più chiamate a OnIdle
. La prima chiamata è per gli scopi di MFC. È possibile effettuare chiamate aggiuntive a OnIdle
per eseguire il proprio lavoro in background.
Per altre informazioni sull'esecuzione dell'elaborazione inattiva, vedere OnIdle nella guida di riferimento alla libreria MFC.