Compartilhar via


Processamento de Loop ocioso

Muitos aplicativos executam processamento longo "em segundo plano." Às vezes, considerações sobre desempenho determinam uso de multithreading para tal trabalho.Segmentos envolvem sobrecarga extra de desenvolvimento, portanto, não são recomendados para tarefas simples como o trabalho de tempo ocioso MFC faz o OnIdle função.Este artigo se concentra no processamento ocioso.Para obter mais informações sobre consulte multithreading, Tópicos Multithreading.

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 executar processamento de tempo ocioso dividindo um processo demorado em muitos pequenos fragmentos.Depois de processar cada fragmento, o aplicativo gera o controle de execução do Windows usando um PeekMessage loop.

Este artigo explica duas maneiras para ocioso processamento em seu aplicativo:

  • Usando PeekMessage em loop de mensagem principal do MFC.

  • A incorporação de outro PeekMessage loop em algum outro lugar no aplicativo.

PeekMessage no Loop de mensagem do MFC

Em um aplicativo desenvolvido com o MFC, a mensagem principal de loop na CWinThread classe contém um loop de mensagem chama o PeekMessage API do Win32.Esse loop também chamadas de OnIdle função de membro CWinThread entre as mensagens.Um aplicativo pode processar mensagens em tempo de inatividade, substituindo o OnIdle função.

ObservaçãoObservação

Executar, OnIdle, e determinadas funções de membro são agora membros da classe CWinThread em vez da classe CWinApp.CWinAppderivado de CWinThread.

Para obter mais informações sobre como executar processamento ocioso, consulte OnIdle na Referência MFC.

PeekMessage em outro lugar em seu aplicativo

Outro método para executar um aplicativo de processamento ocioso envolve a incorporaçã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 tal um 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 como gravar 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 incorporado em uma função, loops, desde que haja processamento ocioso para fazer.Dentro do loop, um loop aninhado chama repetidamente PeekMessage.Como a chamada retorna um valor diferente de zero, o loop chama CWinThread::PumpMessage para executar a conversão de mensagem normal e expedição.Embora PumpMessage não é documentado, você pode examinar o código-fonte no arquivo ThrdCore.Cpp no diretório \atlmfc\src\mfc de instalação do Visual C++.

Uma vez as extremidades do loop interno, o loop externo realiza processamento ocioso com uma ou mais chamadas para OnIdle.A primeira chamada é para fins do MFC.Você pode fazer chamadas adicionais para OnIdle para trabalhar em segundo plano.

Para obter mais informações sobre como executar processamento ocioso, consulte OnIdle na referência da biblioteca MFC.

Consulte também

Conceitos

Tópicos do MFC geral