Elaborazione del ciclo inattivo
Molte applicazioni eseguono la lunga elaborazione “in background„. Talvolta le considerazioni sulle prestazioni preferibile del multithreading per tale lavoro.I thread includono un ulteriore sovraccarico di sviluppo, pertanto non sono consigliati per semplici attività come il lavoro in fase di inattività che vengono effettuate nella funzione di OnIdle .Gli stati attivi di questo articolo sull'elaborazione inattiva.Per ulteriori informazioni sul multithreading, vedere Argomenti di multithreading.
Alcuni tipi di elaborazione in background in modo appropriato sono eseguiti durante gli intervalli che l'utente non interagisce in caso contrario con l'applicazione.In un'applicazione sviluppata del sistema operativo Microsoft Windows, un'applicazione può eseguire elaborazioni di tempo di inattività suddividendo un lungo processo in molti piccoli frammenti.Dopo l'elaborazione ogni frammento, il controllo dell'esecuzione di conterrà di un'applicazione alle finestre utilizzando un ciclo di PeekMessage .
Questo articolo vengono illustrati due modi per eseguire l'elaborazione inattiva nell'applicazione:
Utilizzando PeekMessage il ciclo di messaggi principale di MFC.
Incorporando un altro ciclo di PeekMessage altrove nell'applicazione.
PeekMessage il ciclo di messaggi MFC
In un'applicazione compilata con MFC, il ciclo di messaggi principale nella classe di CWinThread contiene un ciclo di messaggi che chiama PeekMessage API Win32.Questo ciclo inoltre chiama la funzione membro di OnIdle di CWinThread tra i messaggi.Un'applicazione può elaborare i messaggi in questo periodo di inattività eseguendo l'override della funzione di OnIdle .
[!NOTA]
Esegui, OnIdlee certe altre funzioni membro ora sono membri di classe CWinThread anziché di classe CWinApp.CWinApp è derivata da CWinThread.
Per ulteriori informazioni su come eseguire l'elaborazione inattiva, vedere OnIdlein riferimenti alla libreria MFC.
PeekMessage altrove nell'applicazione
Un altro metodo per eseguire l'elaborazione inattiva in un'applicazione comporta come incorporare un ciclo di messaggi in una delle funzioni.Questo ciclo di messaggi è molto simile al ciclo di messaggi principale di MFC, ha rilevato in CWinThread::Run.Ciò significa che tale ciclo in un'applicazione compilata con MFC deve eseguire molte delle stesse funzioni del ciclo di messaggi principale.Nel frammento di codice riportato di seguito viene illustrato come scrivere 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 il ciclo finché esiste alcuna elaborazione inattiva da eseguire.All'interno del ciclo, un ciclo annidato chiama ripetutamente PeekMessage.Purché tale la chiamata restituisce un valore diverso da zero, il ciclo chiama CWinThread::PumpMessage per eseguire la conversione e inviare normali del messaggio.Sebbene PumpMessage non documentato, è possibile esaminare il codice sorgente nel file di ThrdCore.Cpp directory \ src \ di atlmfc \ MFC di installazione di Visual C++.
Il ciclo interno termina una volta, il ciclo esterno viene eseguita l'elaborazione inattiva con uno o più chiamate a OnIdle.La prima chiamata viene per scopi di MFC.È possibile effettuare chiamate aggiuntive a OnIdle per il proprio lavoro in background.
Per ulteriori informazioni su come eseguire l'elaborazione inattiva, vedere OnIdle in riferimenti alla libreria MFC.