Compartilhar via


Processamento de loop ocioso

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.

Consulte também

Tópicos gerais do MFC