본문 바로가기
IT-개발,DB

[개발/MFC] 유휴 루프 처리

by SB리치퍼슨 2011. 4. 15.

유휴 루프 처리

Visual Studio .NET 2003

많은 응용 프로그램은 "백그라운드에서" 처리 시간이 긴 작업을 수행합니다. 경우에 따라 이러한 작업에 다중 스레딩을 사용하면 성능을 향상시킬 수 있습니다. 스레드로 인해 개발 과정에 불필요한 오버헤드가 발생하기 때문에 MFC가 OnIdle 함수에서 수행하는 유휴 시간 작업과 같은 단순 작업에는 적당하지 않습니다. 따라서 이 문서에서는 유휴 처리를 중심으로 설명합니다. 다중 스레딩에 대한 자세한 내용은 다중 스레딩 항목을 참조하십시오.

일 부 백그라운드 처리는 사용자가 응용 프로그램과 상호 작용을 하지 않는 동안에 적절하게 수행됩니다. Microsoft Windows 운영 체제용으로 개발된 응용 프로그램은 시간이 많이 걸리는 프로세스를 여러 개의 작은 조각으로 나눠 유휴 시간에 수행할 수 있습니다. 각 조각을 수행한 후에 응용 프로그램은 PeekMessage 루프를 사용하여 실행 제어를 Windows로 돌려줍니다.

다음은 응용 프로그램에서 유휴 처리를 수행하는 두 가지 방법에 대한 설명입니다.

  • MFC의 주 메시지 루프에서 PeekMessage 사용
  • 응용 프로그램의 다른 곳에서 다른 PeekMessage 루프 포함

MFC 메시지 루프에서 PeekMessage 사용

MFC로 개발한 응용 프로그램에서 CWinThread 클래스에 있는 주 메시지 루프는 PeekMessage Win32 API를 호출하는 메시지 루프를 포함합니다. 또한, 이 루프는 메시지 사이사이에 CWinThreadOnIdle 멤버 함수도 호출합니다. 응용 프로그램은 OnIdle 함수를 재정의하여 유휴 시간에 메시지를 처리할 수 있습니다.

참고   Run, OnIdle 및 다른 일부 멤버 함수는 이제 CWinApp 클래스가 아닌 CWinThread 클래스의 멤버입니다. CWinAppCWinThread에서 파생됩니다.

유휴 처리에 대한 자세한 내용은 MFC Reference의 OnIdle을 참조하십시오.

응용 프로그램의 다른 곳에서 PeekMessage 포함

응용 프로그램에서 유휴 처리를 수행하는 다른 방법은 함수 중 하나에 메시지 루프를 포함하는 것입니다. 이 메시지 루프는 CWinThread::Run에 서 볼 수 있는 MFC의 주 메시지 루프와 매우 유사합니다. 이것은 MFC로 개발한 응용 프로그램에 있는 이러한 루프가 주 메시지 루프와 대부분 같은 기능을 수행한다는 의미입니다. 다음 코드에서는 MFC와 호환되는 메시지 루프를 작성하는 방법을 보여 줍니다.

while ( bDoingBackgroundProcessing ) 
{ 
    MSG msg;
    while ( ::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) 
    { 
        if ( !PumpMessage( ) ) 
        { 
            bDoingBackgroundProcessing = FALSE; 
            ::PostQuitMessage( ); 
            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을 참조하십시오

출처 : http://msdn.microsoft.com/ko-kr/library/cc485601%28v=vs.71%29.aspx


반응형

댓글