Compartilhar via


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.

Consulte também

Conceitos

Tópicos MFC gerais