유휴 루프 처리
많은 응용 프로그램은 시간이 오래 걸리는 프로세스를 "백그라운드"에서 수행 이러한 작업에 대 한 다중 스레드를 사용 하 여 성능 고려 사항을 받아 때때로.스레드 관련 오버 헤드를 추가 개발, MFC 하지에서 유휴 시간 작업 처럼 단순한 작업을 권장 하지 않습니다 때문에 OnIdle 함수.이 문서에서는 유휴 처리에 중점을 둡니다.다중 스레딩을 참조 하는 방법에 대 한 자세한 내용은 다중 스레딩 항목.
일부 백그라운드 처리 사용자 응용 프로그램과 그렇지 작용 하지 않는 기간 중 적절 하 게 수행 됩니다.Microsoft Windows 운영 체제에 대 한 개발 하는 응용 프로그램에서 시간이 오래 걸리는 프로세스를 여러 작은 조각으로 분할 하 여 유휴 시간 처리 응용 프로그램을 수행할 수 있습니다.각 부분을 처리 한 후 응용 프로그램 실행 제어 Windows를 사용 하 여 얻을 수 있는 PeekMessage 루프.
이 문서에서는 처리 응용 프로그램에서 유휴 실행 하는 두 가지 방법에 설명 합니다.
사용 하 여 PeekMessage MFC의 기본 메시지 루프입니다.
다른 포함 PeekMessage 응용 프로그램에서 다른 곳을 반복 합니다.
MFC 메시지 루프에서 PeekMessage
MFC로 개발한 응용 프로그램에서를 주 메시지 루프에 CWinThread 클래스 호출 메시지 루프가 포함의 PeekMessage Win32 API입니다.이 루프도 호출을 OnIdle 멤버 함수를 CWinThread 메시지 사이.신청서를 재정의 하 여이 유휴 시간에 메시지를 처리 하는 OnIdle 함수.
[!참고]
실행, OnIdle, 및 특정 멤버 함수는 이제 클래스의 멤버는 CWinThread 대신 클래스의 CWinApp.CWinApp는 CWinThread에서 파생됩니다.
유휴 처리를 수행 하는 방법에 대 한 자세한 내용은 OnIdle 에 있는 MFC 참조.
응용 프로그램의 다른 곳에서 PeekMessage
유휴 처리 응용 프로그램에서 수행 하는 또 다른 방법은 함수 중 하나에 메시지 루프를 포함 하는 작업이 포함 됩니다.이 메시지 루프가 발견 하는 MFC의 기본 메시지 루프를 매우 유사 CWinThread::Run.즉, 루프 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 자신의 백그라운드 작업을 수행할 수 있습니다.
유휴 처리를 수행 하는 방법에 대 한 자세한 내용은 OnIdle 는 MFC 라이브러리 참조 합니다.