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

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

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

セキュリティに関するメモセキュリティに関するメモ

このサンプル コードは概念を示すためのものであり、その概念に関連するコードのみを示しています。特定の環境について必ずしもセキュリティ要件を満たしていませんので、そのまま使用しないでください。セキュリティおよびエラー処理コードを追加して、プロジェクトをより安全かつ堅牢にすることをお勧めします。これらのサンプル コードは、現状有姿のままで提供されるものであり、一切保証されていません。

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

Visual Studio のサンプルにアクセスするには

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

    既定では、これらのサンプルは drive:\Program Files\Microsoft Visual Studio 10.0\Samples\ にインストールされています。

  • このサンプルの最新版および他のサンプルの一覧については、MSDN Web サイト上で Visual Studio サンプル 」を参照してください。

サンプルのビルドと実行

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

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

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

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

MTRECALC のスプレッドシートのセルを更新または 今すぐ更新] をクリックするたびに再計算をシミュレートする、2 つの整数を追加する単純なフォームを表示します。 MTRECALC が時間のかかる計算をシミュレートしている間、結果フィールドには "Recalculating..." と表示されます。 速度の再計算 デモ メニューをクリックして、再計算時間を変更できます。

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

ワーカー スレッドだけ再計算されるときに、ワーカー スレッドを強制終了 コマンド メニューの デモ 有効になっています。 コマンドのワーカー スレッドの削除が行われる前に、再計算が中断している場合、[結果] フィールドに疑問符 (?) 表示 ("?")。 計算、 コマンド [今すぐ更新を再開することができます。

再計算が完了する前に MTRECALC ドキュメントを保存しようとすると、"Do you wish to wait while recalculation finishes?" というメッセージが表示されます。[はい] をクリックすると、砂時計が表示されて再計算が完了するまで待機します。再計算が完了するとドキュメントが保存されます。 このデモンストレーションを練習するには、おそらく、5 秒 10 に再計算時既定値からを増やすには、速度の再計算 コマンドを使用する必要が (15 秒)。 これにより、 メニューのファイルと保存] ダイアログ ボックスの をナビゲートするための十分な時間をことができます。

Keywords

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

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 サンプル