Processamento de loop ocioso
Muitos aplicativos executam processamento longa execução “no plano de fundo.” Às vezes as considerações de desempenho ditam usando a multithreading para esse trabalho. Os threads envolvem a sobrecarga adicional de desenvolvimento portanto, não são recomendados para tarefas simples como o trabalho do tempo ocioso que o MFC faz na função de OnIdle . Este artigo enfoca o processamento ocioso. Para obter mais informações sobre de multithreading, consulte Tópicos de multithreading.
Alguns tipos de processamento em segundo plano são feitas durante adequadamente intervalos que o usuário não estão interagindo de outra forma com o aplicativo. Em um aplicativo desenvolvido para o sistema operacional Microsoft Windows, um aplicativo pode executar o processamento de tempo ocioso por um processo longo em muitos fragmentos pequenos. Depois de processado cada fragmento, o aplicativo gerencie o controle de execução ao windows usando um loop de PeekMessage .
Este artigo explica duas formas de executar o processamento ocioso em seu aplicativo:
Usando PeekMessage no loop principal da mensagem MFC.
Inserindo outro loop de PeekMessage em outro lugar no aplicativo.
PeekMessage no loop de mensagem MFC
Em um aplicativo desenvolvido com MFC, o loop principal da mensagem na classe de CWinThread contém um loop de mensagem que chama PeekMessage a API do Win32. Esse loop também chamará a função de membro de OnIdle de CWinThread entre as mensagens. Um aplicativo pode processar mensagens nesse tempo ocioso substituindo a função de OnIdle .
Dica
Executar, OnIdle, determinadas e outras funções de membro agora são membros da classe CWinThread em vez de CWinAppda classe.CWinApp é derivado de CWinThread.
Para obter mais informações sobre como executar o processamento ociosa, consulte OnIdlena referência de MFC.
PeekMessage em outro lugar em seu aplicativo
Outro método para executar o processamento ocioso em um aplicativo envolver inserir um loop de mensagem em uma de suas funções. Esse loop da mensagem é bem semelhante ao loop principal da mensagem MFC, encontrado em CWinThread::Run. Isso significa que um loop em um aplicativo desenvolvido com MFC deve executar muitas das mesmas funções que o loop principal da mensagem. O seguinte fragmento de código a seguir demonstra a gravação de um loop de mensagem que seja compatível com 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
}
Esse código a seguir, inserido em uma função, loop enquanto houver um processamento ocioso para fazer. Dentro desse loop, um loop aninhado chama repetidamente PeekMessage. Como essa chamada retorna um valor diferente de zero, o loop CWinThread::PumpMessage chama para executar tradução normal e o despacho da mensagem. Embora seja PumpMessage não documentado, você pode revisar seu código-fonte no arquivo de ThrdCore.Cpp no diretório \ de atlmfc \ src \ mfc da instalação do Visual C++.
Uma vez que o loop interno é encerrada, o loop externo executa o processamento ociosa com uma ou várias chamadas para OnIdle. A primeira chamada é para propósitos de MFC. Você pode fazer chamadas adicionais a OnIdle para fazer seu próprio trabalho em segundo plano.
Para obter mais informações sobre como executar o processamento ociosa, consulte OnIdle na referência da biblioteca MFC.