Partilhar via


Processamento de ciclo ocioso

Muitos aplicativos executam um processamento demorado "em segundo plano". Às vezes, considerações de desempenho ditam o uso de multithreading para esse trabalho. Os threads envolvem sobrecarga de desenvolvimento extra, portanto, não são recomendados para tarefas simples, como o trabalho em tempo ocioso que o MFC faz na função OnIdle . Este artigo foca-se no processamento ocioso. Para obter mais informações sobre multithreading, consulte Multithreading Topics.

Alguns tipos de processamento em segundo plano são feitos adequadamente durante intervalos que o usuário não está interagindo com o aplicativo. Em um aplicativo desenvolvido para o sistema operacional Microsoft Windows, um aplicativo pode executar processamento em tempo ocioso dividindo um processo demorado em muitos pequenos fragmentos. 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 ocioso em seu aplicativo:

  • Usando PeekMessage no loop de mensagem principal do MFC.

  • Incorporando outro loop PeekMessage em outro lugar no aplicativo.

PeekMessage no loop de mensagens MFC

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

Observação

Run, OnIdlee algumas outras funções de membro são agora membros da classe CWinThread e não da classe CWinApp. CWinApp deriva de CWinThread.

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

PeekMessage em outra parte do seu aplicativo

Outro método para executar o processamento ocioso em um aplicativo envolve a incorporação de um loop de mensagem em uma de suas funções. Este 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 que é 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
}

Este código, incorporado numa função, entra em loop enquanto houver processamento ocioso para realizar. Dentro desse loop, um loop aninhado chama repetidamente PeekMessage. Desde que essa chamada retorne um valor diferente de zero, o loop chama CWinThread::PumpMessage para executar a tradução e o envio normais de mensagens. Embora PumpMessage não esteja documentado, você pode examinar seu código-fonte no arquivo ThrdCore.Cpp no diretório \atlmfc\src\mfc de sua instalação do Visual C++.

Quando o loop interno termina, o loop externo executa o processamento ocioso com uma ou mais chamadas para OnIdle. A primeira chamada é para fins de MFC. Você pode fazer chamadas adicionais para OnIdle para realizar o seu próprio trabalho em segundo plano.

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

Ver também

Tópicos gerais do MFC