Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Muitos aplicativos executam processamento longo "em segundo plano". Às vezes, considerações de desempenho ditam o uso de multithreading para esse trabalho. Os threads envolvem sobrecarga extra de desenvolvimento, portanto, eles não são recomendados para tarefas simples, como o trabalho de tempo ocioso que o MFC faz na função OnIdle . Este artigo se concentra no processamento ocioso. Para obter mais informações sobre multithreading, consulte Tópicos sobre Multithreading.
Alguns tipos de processamento em segundo plano são feitos adequadamente durante intervalos que o usuário não está 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 dividindo um processo longo em muitos fragmentos pequenos. Depois de processar cada fragmento, o aplicativo produz controle de execução para o Windows usando um loop PeekMessage .
Este artigo explica duas maneiras de fazer o processamento em estado ocioso em seu aplicativo.
Usando PeekMessage no loop de mensagem principal do MFC.
Inserindo outro loop PeekMessage em outro lugar no aplicativo.
PeekMessage no loop de mensagem do MFC
Em um aplicativo desenvolvido com mfc, o loop de mensagem principal na CWinThread classe contém um loop de mensagem que chama a API PeekMessage Win32. Esse loop também chama a função membro OnIdle entre mensagens CWinThread. Um aplicativo pode processar mensagens nesse tempo ocioso substituindo a OnIdle função.
Observação
Run, OnIdlee certas outras funções de membro agora são membros da classe CWinThread em vez da classe CWinApp. CWinApp é derivado de CWinThread.
Para obter mais informações sobre como executar o processamento ocioso, consulte OnIdle na Referência do MFC.
PeekMessage em outro lugar no aplicativo
Outro método para executar o processamento ocioso em um aplicativo envolve a inserção de um loop de mensagem em uma de suas funções. Esse loop de mensagem é muito semelhante ao loop de mensagem principal do MFC, encontrado em CWinThread::Run. Isso significa que esse loop em um aplicativo desenvolvido com MFC deve executar muitas das mesmas funções que o loop de mensagem principal. O fragmento de código a seguir demonstra a gravação de um loop de mensagem compatível com o 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, inserido em uma função, faz loops desde que haja processamento ocioso a ser feito. Dentro desse loop, um loop aninhado chama PeekMessage repetidamente. Desde que essa chamada retorne um valor diferente de zero, o loop chama CWinThread::PumpMessage para executar a tradução e a expedição de mensagens normais. Embora não esteja PumpMessage documentado, você pode examinar seu código-fonte no arquivo ThrdCore.Cpp no diretório \atlmfc\src\mfc da instalação do Visual C++.
Depois que o loop interno termina, o loop externo executa o processamento ocioso com uma ou mais chamadas para OnIdle. A primeira chamada é para fins do MFC. Você pode fazer chamadas adicionais para OnIdle para realizar seu próprio trabalho em segundo plano.
Para obter mais informações sobre como executar o processamento ocioso, consulte OnIdle na Biblioteca de Referência do MFC.