다음을 통해 공유


MTRECALC 샘플: 다중 스레드 응용 프로그램 지원

업데이트: 2007년 11월

MTRECALC 샘플에서는 다중 스레드 응용 프로그램에 대한 MFC 지원을 보여 줍니다.

MFC는 사용자 인터페이스 스레드와 작업자 스레드라는 두 가지 유형의 스레드를 구분합니다. 사용자 인터페이스 스레드에는 다른 스레드와 독립적으로 사용자 인터페이스 이벤트를 처리하는 자체 메시지 펌프가 있습니다. 작업자 스레드에는 자체의 메시지 펌프가 없습니다. MTRECALC에서는 작업자 스레드를 보여 줍니다. 작업자 스레드에서는 두 숫자를 더하는 계산이 완료될 때까지 타이머를 기다림으로써 시간이 많이 걸리는 계산을 시뮬레이션합니다.

보안 정보:

이 샘플 코드는 개념을 보여 주기 위해 제공되며 가장 안전한 코드 작성 방법을 제시하지 않을 수 있으므로 응용 프로그램이나 웹 사이트에서 사용할 수 없습니다. Microsoft는 샘플 코드를 원래 용도 이외의 다른 용도로 사용하는 경우 발생하는 부수적이나 파생적인 손해에 대해 책임을 지지 않습니다.

샘플 및 이를 설치하기 위한 지침을 가져오려면

  • Visual Studio의 도움말 메뉴에서 샘플을 클릭합니다.

    자세한 내용은 샘플 파일 찾기를 참조하십시오.

  • 최신 버전 및 전체 샘플 목록은 Visual Studio 2008 Samples 페이지에서 온라인으로 사용할 수 있습니다.

  • 컴퓨터의 하드 디스크에서도 샘플을 찾을 수 있습니다. 기본적으로 샘플과 추가 정보 파일은 \Program Files\Visual Studio 9.0\Samples\ 아래의 폴더에 복사됩니다. Visual Studio Express Edition의 경우에는 모든 샘플이 온라인에 있습니다.

샘플 빌드 및 실행

MTRECALC 샘플을 빌드하고 실행하려면

  1. 솔루션 파일인 MtRecalc.sln을 엽니다.

  2. 빌드 메뉴에서 빌드를 클릭합니다.

  3. 디버그 메뉴에서 디버깅하지 않고 시작을 클릭합니다.

MTRECALC에서는 두 정수를 더하는 간단한 폼을 표시하고, 사용자가 셀을 업데이트하거나 Recalculate Now를 클릭할 때마다 다시 계산하는 스프레드시트를 시뮬레이션합니다. MTRECALC에서 시간이 많이 걸리는 계산을 시뮬레이션하는 동안에는 결과 필드에 "Recalculating..."이라는 메시지가 표시됩니다. Demo 메뉴에 있는 Speed of Recalculation을 클릭하면 재계산 시간을 변경할 수 있습니다.

별도의 작업자 스레드에서 다시 계산할 때와 주 응용 프로그램 사용자 인터페이스 스레드와 동일한 스레드에서 다시 계산할 때의 "느낌"을 비교하려면 Demo 메뉴에서 Worker Thread 또는 Single Thread를 클릭합니다. 예를 들어, 단일 스레드 데모에서는 다시 계산하는 동안 MTRECALC의 메뉴에 액세스할 수 없지만 작업자 스레드 데모에서는 액세스할 수 있습니다. 또한, 단일 스레드 데모에서는 MTRECALC가 다시 계산하는 동안 정수 필드 중 하나를 업데이트할 수 없지만 작업자 스레드 데모에서는 업데이트할 수 있습니다. 작업자 스레드가 이미 다시 계산하고 있을 때 필드를 업데이트하면 현재 재계산 작업은 중단되고 재계산이 새로 시작됩니다.

Demo 메뉴의 Kill Worker Thread 명령은 작업자 스레드에서 다시 계산하는 동안에만 활성화됩니다. Kill Worker Thread 명령을 사용하여 재계산이 완료되기 전에 작업을 중단하면 결과 필드에 물음표("?")가 표시됩니다. Recalculate Now 명령을 사용하면 계산을 다시 시작할 수 있습니다.

재계산이 완료되기 전에 MTRECALC 문서를 저장하려고 하면 "Do you wish to wait while recalculation finishes?"라는 메시지가 표시됩니다. Yes를 클릭하면 MTRECALC에서는 재계산이 완료될 때까지 모래 시계를 표시한 후 문서를 저장합니다. 이 데모를 실행하려면 Speed of Recalculation 명령을 사용하여 재계산 시간을 기본값인 5초에서 10초 또는 15초로 증가시켜야 할 수도 있습니다. 이렇게 하면 File 메뉴와 Save 대화 상자를 탐색할 수 있는 충분한 시간이 생깁니다.

키워드

이 샘플에서는 다음의 키워드를 보여 줍니다.

AfxBeginThread, AfxGetMainWnd, AfxMessageBox, CArchive::IsStoring, CCmdTarget::BeginWaitCursor, CCmdTarget::EndWaitCursor, CCmdUI::Enable, CCmdUI::SetCheck, CDialog::DoModal, CDocument::GetFirstViewPosition, CDocument::GetNextView, CDocument::OnNewDocument, CDocument::OnSaveDocument, CDocument::SetModifiedFlag, CDocument::UpdateAllViews, CFrameWnd::Create, CFrameWnd::DockControlBar, CFrameWnd::EnableDocking, CFrameWnd::LoadFrame, CObject::AssertValid, CObject::Dump, CObject::Serialize, CStatusBar::CommandToIndex, CStatusBar::SetPaneText, CString::Format, CString::LoadString, CView::DoPreparePrinting, CView::GetDocument, CView::OnBeginPrinting, CView::OnEndPrinting, CView::OnPreparePrinting, CView::OnPrint, CView::OnUpdate, CWinApp::AddDocTemplate, CWinApp::EnableShellOpen, CWinApp::InitInstance, CWinApp::LoadStdProfileSettings, CWinApp::RegisterShellFileTypes, CWnd::DoDataExchange, CWnd::OnCreate, CWnd::OnKillFocus, CWnd::PostMessage, CWnd::SendMessage, CWnd::SetWindowText, CWnd::ShowWindow, CWnd::UpdateData, CWnd::UpdateWindow, CreateEvent, DragAcceptFiles, GetExitCodeThread, GetVersion, LoadBitmap, PostMessage, ResetEvent, SetEvent, Sleep, WaitForSingleObject

참고:

이 샘플을 비롯한 일부 샘플은 Visual C++ 마법사, 라이브러리 및 컴파일러의 변경 내용을 반영하도록 수정되지 않았지만 해당 작업의 수행 방법을 보여 줍니다.

참고 항목

기타 리소스

MFC 샘플