MTMDI サンプル : MFC ユーザー インターフェイス スレッドの例

更新 : 2007 年 11 月

MTMDI サンプルでは、ユーザー インターフェイス イベントがメイン アプリケーション スレッドとは別のスレッドで処理される、MFC ユーザー インターフェイス スレッドの例を示します。このサンプルは、シングルスレッド MDI サンプルを変更したものです。

MTMDI では、ボールが弾むウィンドウを別のスレッドに置くことが合理的であると説明しているわけではありません。シングル プロセッサ コンピュータの場合は、MDI サンプルと MTMDI サンプルの違いがわからない可能性があります。マルチプロセッサ コンピュータでも、ウィンドウ タイマに基づいてボールが動いている場合は、この違いがわからない可能性があります。

しかし、MTMDI では MFC ユーザー インターフェイス スレッドを実装する方法を示しています。MDI サンプルと MTMDI サンプルのソースを比較して、MFC ユーザー インターフェイス スレッドを使用した場合のプログラミング オーバーヘッドに注目してください。

MTMDI のプログラミング オーバーヘッドは、ユーザー インターフェイス スレッドを使用するにはプログラミング コストを正当化できる相当の理由が必要であることを警告しています。MFC でよく使用されるスレッドのタイプはワーカー スレッドです。ワーカー スレッドの例は、MTRECALC サンプルにあります。

s3wsyb55.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 の場合、すべてのサンプルはオンライン上にあります。

サンプルのビルドと実行

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

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

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

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

[File] メニューから、2 つの異なる種類のウィンドウを新規作成できます。ウィンドウを作成すると、[Color]、[Speed]、[Window]、および [Help] のいずれかのメニューのコマンドを使用して、ウィンドウの項目の属性を変更できます。[Hello] ウィンドウには [Speed] メニューがないことに注意してください。

MTMDI では、CBounceThread という CWinThread 派生クラスを使用します。CBounceThread は、Mtbounce.cpp ファイルで実装されています。このスレッドには、ウィンドウ内で弾むボールをアニメーション表示するために必要な描画とタイミングのすべてのコードが含まれています。

アプリケーションでは、MDI 子ウィンドウが作成されるのと同様に、各スレッドが作成されます。ウィンドウとスレッドの作成は、Bounce.cpp の CBounceMDIChildWnd::Create 関数で行われます。この関数はウィンドウとスレッドの両方を作成し、スレッドをウィンドウに関連付けます。

ボールが弾むウィンドウを閉じると、関連付けられたスレッドは自動的に破棄されます。[Hello] ウィンドウには独自のスレッドがないため、メッセージはアプリケーションのプライマリ スレッドによって処理されます。

キーワード

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

AfxGetInstanceHandle; AfxMessageBox; AfxRegisterWndClass; CBitmap::CreateCompatibleBitmap; CCmdTarget::OnCmdMsg; CCmdUI::SetCheck; CColorDialog::DoModal; CColorDialog::GetColor; CDC::BitBlt; CDC::CreateCompatibleDC; CDC::DeleteDC; CDC::DrawText; CDC::Ellipse; CDC::FillRect; CDC::GetDeviceCaps; CDC::SelectObject; CDC::SetBkColor; CDC::SetTextColor; CFrameWnd::LoadFrame; CFrameWnd::rectDefault; CGdiObject::DeleteObject; CMDIChildWnd::Create; CMenu::LoadMenu; CRect::Height; CRect::Width; CWinApp::ExitInstance; CWinApp::InitInstance; CWnd::Create; CWnd::DestroyWindow; CWnd::GetClientRect; CWnd::GetCurrentMessage; CWnd::GetDC; CWnd::GetDlgItem; CWnd::GetWindow; CWnd::Invalidate; CWnd::KillTimer; CWnd::MessageBox; CWnd::OnCreate; CWnd::OnDestroy; CWnd::OnLButtonDown; CWnd::OnPaint; CWnd::OnSize; CWnd::OnTimer; CWnd::ReleaseDC; CWnd::SendMessage; CWnd::SetTimer; CWnd::SetWindowPos; CWnd::ShowWindow; CWnd::UpdateWindow; CloseHandle; CreateEvent; CreateThread; EnumChildWindows; GetSysColor; GetVersion; LOWORD; LoadCursor; LoadIcon; LoadMenu; MAKEINTRESOURCE; RGB; SetEvent; Sleep; WaitForSingleObject; max; min

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

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

参照

その他の技術情報

MFC サンプル