C++ と MFC を使用するマルチスレッド
MFC (Microsoft Foundation Class) ライブラリでは、マルチスレッド アプリケーションがサポートされています。 このトピックでは、プロセスとスレッドについて説明します。また、MFC でマルチスレッドを使用する方法についても説明します。
プロセスとは、現在実行されているアプリケーションのインスタンスのことです。 たとえば、[メモ帳] アイコンをダブルクリックすると、メモ帳のプロセスが起動されます。
スレッドとは、プロセスの中で実行される処理の単位です。 メモ帳を起動すると、オペレーティング システムは 1 個のプロセスを生成し、このプロセスのプライマリ スレッドの処理を開始します。 プライマリ スレッドが終了すると、プロセスが終了します。 このプライマリ スレッドは、スタートアップ コードから関数アドレスによってオペレーティング システムに渡されます。 通常、main 関数または WinMain 関数のアドレスが渡されます。
必要に応じて、プライマリ スレッド以外のスレッドを作成できます (マルチスレッド)。 新しく生成したスレッドは、ユーザーが終了を待つ必要がないバックグラウンド処理またはメンテナンス処理を行う際に使用できます。 MFC アプリケーションのスレッドはすべて CWinThread オブジェクトとして表されます。 ほとんどの場合、CWinThread オブジェクトはプログラム上で直接生成する必要はありません。フレームワークの AfxBeginThread ヘルパー関数を呼び出すと生成されます。
MFC では、ユーザー インターフェイス スレッドとワーカー スレッドの 2 種類に区別されます。 ユーザー インターフェイス スレッドでは主に、ユーザー入力を処理し、ユーザーが生成したイベントおよびメッセージに応答します。 ワーカー スレッドでは、ユーザー入力が必要ない、再計算などの処理を行います。 Win32 API ではこの 2 つのスレッドを区別しません。スレッドの起動アドレスがわかれば、スレッドを実行できます。 MFC では、ユーザー インターフェイス上のイベントに対してメッセージ ポンプを指定することにより、ユーザー インターフェイス スレッドに対して専用の処理を行います。 CWinApp は、CWinThread から派生したユーザー インターフェイス スレッド オブジェクトの例であり、ユーザーが生成したイベントおよびメッセージを処理します。
複数のスレッドが同一のオブジェクトにアクセスする場合は注意が必要です。 このような状況で発生する問題の対処方法については、「マルチスレッド : プログラミングのヒント」を参照してください。 「マルチスレッド : 同期クラスの使用法」では、複数のスレッドから単一のオブジェクトへのアクセスを同期する際に使用できるクラスについて説明します。
マルチスレッド プログラムの作成とデバッグには高度な技術が必要です。プログラマはオブジェクトが一度に複数のスレッドからアクセスされないようにする必要があるからです。 マルチスレッドに関連するトピックでは、マルチスレッド プログラムで MFC を使用する方法について説明しますが、マルチスレッド プログラミング技術の基礎については説明していません。 Visual C++ に付属のマルチスレッド MFC サンプル アプリケーションでは、マルチスレッド機能の追加方法や MFC でサポートされない Win32 API を利用した例が示されていますが、これはほんの出発点です。
オペレーティング システムでプロセスとスレッドが処理されるしくみの詳細については、Windows SDK の「Processes and Threads」を参照してください。
MFC がサポートするマルチスレッド機能の詳細については、次のトピックを参照してください。