유휴 루프 처리

많은 애플리케이션이 "백그라운드에서" 긴 처리를 수행합니다. 경우에 따라 성능 고려 사항에 따라 이러한 작업에 다중 스레딩을 사용하는 것이 결정됩니다. 스레드에는 추가 개발 오버헤드가 포함되므로 MFC가 OnIdle 함수에서 수행하는 유휴 시간 작업과 같은 간단한 작업에는 권장되지 않습니다. 이 문서에서는 유휴 처리에 중점을 둡니다. 다중 스레딩에 대한 자세한 내용은 다중 스레딩 항목을 참조 하세요.

사용자가 애플리케이션과 상호 작용하지 않는 간격 동안 일부 종류의 백그라운드 처리가 적절하게 수행됩니다. Microsoft Windows 운영 체제용으로 개발된 애플리케이션에서 애플리케이션은 긴 프로세스를 많은 작은 조각으로 분할하여 유휴 시간 처리를 수행할 수 있습니다. 각 조각을 처리한 후 애플리케이션은 PeekMessage 루프를 사용하여 Windows에 실행 제어를 생성합니다.

이 문서에서는 애플리케이션에서 유휴 처리를 수행하는 두 가지 방법을 설명합니다.

  • MFC의 기본 메시지 루프에서 PeekMessage 사용

  • 애플리케이션의 다른 위치에 다른 PeekMessage 루프를 포함합니다.

MFC 메시지 루프의 PeekMessage

MFC를 사용하여 개발된 애플리케이션에서 클래스의 기본 메시지 루프 CWinThread 에는 PeekMessage Win32 API를 호출하는 메시지 루프가 포함되어 있습니다. 또한 이 루프는 OnIdle 메시지 간의 멤버 함수를 CWinThread 호출합니다. 애플리케이션은 함수를 재정의하여 이 유휴 시간에 메시지를 처리할 OnIdle 수 있습니다.

참고 항목

Run, OnIdle및 특정 다른 멤버 함수는 이제 클래스가 아닌 클래스 CWinThreadCWinApp의 멤버입니다. CWinAppCWinThread에서 파생됩니다.

유휴 처리 수행에 대한 자세한 내용은 MFC 참조의 OnIdle참조하세요.

애플리케이션의 다른 위치에서 PeekMessage

애플리케이션에서 유휴 처리를 수행하는 또 다른 방법은 함수 중 하나에 메시지 루프를 포함하는 것입니다. 이 메시지 루프는 CWinThread::Run에 있는 MFC의 기본 메시지 루프와 매우 유사합니다. 즉, MFC를 사용하여 개발된 애플리케이션에서 이러한 루프는 기본 메시지 루프와 동일한 많은 함수를 수행해야 합니다. 다음 코드 조각에서는 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
}

함수에 포함된 이 코드는 유휴 처리가 수행되는 한 반복됩니다. 해당 루프 내에서 중첩된 루프는 반복적으로 호출 PeekMessage합니다. 해당 호출이 0이 아닌 값을 반환하는 한 루프는 일반 메시지 변환 및 디스패치를 수행하기 위해 호출 CWinThread::PumpMessage 합니다. 문서화되지 않았지만 PumpMessage Visual C++ 설치의 \atlmfc\src\mfc 디렉터리에 있는 ThrdCore.Cpp 파일에서 소스 코드를 검사할 수 있습니다.

내부 루프가 종료되면 외부 루프는 하나 이상의 호출 OnIdle을 사용하여 유휴 처리를 수행합니다. 첫 번째 호출은 MFC의 용도로 사용됩니다. 추가 호출을 수행하여 OnIdle 자신의 백그라운드 작업을 수행할 수 있습니다.

유휴 처리 수행에 대한 자세한 내용은 MFC 라이브러리 참조의 OnIdle 을 참조하세요.

참고 항목

일반 MFC 항목