Share via


MTRECALC サンプル : マルチスレッド アプリケーションのサポート

更新 : 2007 年 11 月

MTRECALC サンプルでは、MFC によるマルチスレッド アプリケーションのサポートを示します。

MFC では、ユーザー インターフェイス スレッドとワーカー スレッドの 2 種類に区別されます。ユーザー インターフェイス スレッドは独自のメッセージ ポンプを備えており、ほかのスレッドとは別個にユーザー インターフェイス イベントを処理します。ワーカー スレッドには、独自のメッセージ ポンプはありません。MTRECALC では、ワーカー スレッドについて説明します。ワーカー スレッドは、2 つの数値の加算が完了するまでタイマを待機して、時間のかかる計算をシミュレートします。

3kk6acaf.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。

サンプルとそのインストール手順を取得するには

  • Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。

    詳細については、「サンプル ファイルの格納場所」を参照してください。

  • 使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。

  • サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。

サンプルのビルドと実行

MTRECALC サンプルをビルドおよび実行するには

  1. MtRecalc.sln ソリューション ファイルを開きます。

  2. [ビルド] メニューの [ビルド] をクリックします。

  3. [デバッグ] メニューの [デバッグなしで開始] をクリックします。

MTRECALC は、2 つの整数を加算する簡単なフォームを表示します。これは、セルを更新するか、[Recalculate Now] をクリックするたびに再計算を行うスプレッドシートをシミュレートします。MTRECALC が時間のかかる計算をシミュレートしている間、結果フィールドには "Recalculating..." と表示されます。[Demo] メニューの [Speed of Recalculation] をクリックして、再計算の時間を変更できます。

[Demo] メニューの [Worker Thread] または [Single Thread] をクリックして、別個のワーカー スレッドで再計算する場合と、メイン アプリケーションのユーザー インターフェイス スレッドと同じスレッドで再計算する場合の "操作性" を比較してください。たとえば、Single Thread の例では、再計算している間は MTRECALC のメニューにアクセスできませんが、Worker Thread の例では、アクセスできます。Single Thread の例では、MTRECALC で再計算している間は整数フィールドをいずれも更新できませんが、Worker Thread の例では、更新できます。ワーカー スレッドが既に再計算を実行しているときにフィールドを更新すると、アクティブな再計算が破棄され、新しい再計算が開始されます。

[Demo] メニューの [Kill Worker Thread] は、ワーカー スレッドが再計算中のときだけ有効になります。再計算が終了する前に [Kill Worker Thread] を使用して再計算を中断すると、結果フィールドに疑問符 (?) が表示されます。[Recalculate Now] をクリックすると、計算を再開できます。

再計算が完了する前に MTRECALC ドキュメントを保存しようとすると、"Do you wish to wait while recalculation finishes?" というメッセージが表示されます。[はい] をクリックすると、砂時計が表示されて再計算が完了するまで待機します。再計算が完了するとドキュメントが保存されます。通常、この例を実行するには、[Speed of Recalculation] を使用して再計算時間を既定の 5 秒から 10 秒または 15 秒に増やす必要があります。時間を長くすることで、[File] メニューと [名前を付けて保存] ダイアログ ボックスを操作する十分な時間が得られます。

キーワード

このサンプルでは、次のキーワードを使用します。

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

3kk6acaf.alert_note(ja-jp,VS.90).gifメモ :

このサンプルを含む一部のサンプルには、Visual C++ のウィザード、ライブラリ、およびコンパイラの変更が反映されていませんが、必要なタスクを実行する方法は示されています。

参照

その他の技術情報

MFC サンプル