Compartilhar via


Processamento de loop ocioso

Muitos aplicativos executam processamento longo "em plano de fundo." Às vezes, considerações sobre o desempenho ditar o uso de multithreading para essas tarefas.Threads envolvem sobrecarga extra de desenvolvimento, portanto, não são recomendados para tarefas simples como o trabalho de time ocioso MFC oferece no OnIdle função.Este artigo se concentra em processamento ocioso.Para obter mais informações sobre Consulte multithreading, Multithreading tópicos.

Alguns tipos de processamento em segundo plano são feitos adequadamente durante os intervalos que o usuário não está interagindo com o aplicativo caso contrário.Um aplicativo desenvolvido para o sistema operacional Microsoft Windows, um aplicativo pode realizar processamento de time ocioso dividindo um processo demorado em vários pequenos fragmentos.Após processar cada fragmento, o aplicativo gera controle de execução para o Windows usando um PeekMessage loop.

Este artigo explica as duas maneiras de ocioso processamento em seu aplicativo:

  • Usando PeekMessage em loop de mensagem principal do MFC.

  • Incorporar outro PeekMessage loop em algum outro lugar no aplicativo.

PeekMessage em loop de mensagem do MFC

Em um aplicativo desenvolvido com o MFC, o loop de mensagem principal no CWinThread classe contém um loop de mensagem que chama o PeekMessage API do Win32.Esse loop também chama o OnIdle função de membro de CWinThread entre as mensagens. Um aplicativo pode processar as mensagens nesse time ocioso, substituindo o OnIdle função.

Observação:

Executar, OnIdle, e algumas outras funções de membro são agora membros da classe CWinThread em vez da classe CWinApp. CWinApp é derivado de CWinThread.

Para obter mais informações sobre o desempenho processamento ocioso, consulte OnIdle in the Referência da MFC.

PeekMessage Elsewhere no seu aplicativo

Outro método para executar ocioso em um aplicativo de processamento envolve a incorporação de um loop de mensagem em uma das suas funções.Esse loop de mensagem é muito semelhante ao loop de mensagem principal do MFC, encontrado no CWinThread::Run.Significa que tal um loop em um aplicativo desenvolvido com o MFC deve executar muitas das mesmas funções sistema autônomo o loop de mensagem principal.O fragmento de código a seguir demonstra como escrever um loop de mensagem que seja 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, incorporado em uma função, loops sistema autônomo longo sistema autônomo há processamento ocioso para fazer.Dentro do loop, um loop aninhado chama repetidamente PeekMessage.Desde que a telefonar retorna um valor diferente de zero, o loop chama CWinThread::PumpMessage para executar a expedição e conversão de mensagem normal. Embora PumpMessage é não documentado, você pode examinar seu código-fonte no arquivo ThrdCore.cpp no diretório de instalação do Visual C++ \atlmfc\src\mfc.

Uma vez as extremidades do loop interno, o loop externo realiza processamento ocioso com um ou mais planos de OnIdle. A primeira telefonar é para fins do MFC.Você pode fazer chamadas adicionais para OnIdle Para fazer seu próprio trabalho plano de fundo.

Para obter mais informações sobre o desempenho processamento ocioso, consulte OnIdle na referência de biblioteca MFC.

Consulte também

Conceitos

Tópicos Geral da MFC