マルチスレッド: ユーザー インターフェイス スレッドの生成
ユーザー インターフェイス スレッドでは、主にユーザー入力を処理し、ユーザーが生成したイベントに応答します。この処理は、アプリケーションのほかの部分を実行しているスレッドとは無関係に行われます。 CWinApp の派生クラスで提供されるメイン アプリケーション スレッドは、既に生成され実行を開始しています。 このトピックでは、ユーザー インターフェイス スレッドを作成するための手順について説明します。
まず、ユーザー インターフェイス スレッド用のクラスを CWinThread から派生します。 このクラスは DECLARE_DYNCREATE マクロと IMPLEMENT_DYNCREATE マクロを使って宣言し、実装します。 このクラスでは、一部の関数をオーバーライドする必要があります。また、他の関数も必要に応じてオーバーライドできます。 次の表に、各関数とその用途を示します。
ユーザー インターフェイス スレッドを作成するためにオーバーライドする関数
関数 |
目的 |
---|---|
スレッド終了時の後処理を行います。 通常、オーバーライドします。 |
|
スレッドのインスタンスを初期化します。 必ずオーバーライドします。 |
|
スレッド固有のアイドル処理ハンドラーを行います。 通常、オーバーライドしません。 |
|
メッセージを TranslateMessage と DispatchMessage に送る前にフィルタリングします。 通常、オーバーライドしません。 |
|
スレッドのメッセージ ハンドラーおよびコマンド ハンドラーがスローした未処理例外を受け取ります。 通常、オーバーライドしません。 |
|
スレッドの制御関数です。 メッセージ ポンプが含まれます。 この関数をオーバーライドすることはほとんどありません。 |
MFC はパラメーターのオーバーロードによって、AfxBeginThread の 2 つのバージョンを提供します。1 つはユーザー インターフェイス スレッド用であり、もう 1 つは、ワーカー スレッド用です。 ユーザー インターフェイス スレッドを起動するには、AfxBeginThread を呼び出して、以下のパラメーターをこの順で渡します。
CWinThread の派生クラスのオブジェクトの RUNTIME_CLASS。
(省略可) 目的の優先順位。 既定の優先順位は normal です。 優先順位の詳細については、Windows SDK の「SetThreadPriority」を参照してください。
(省略可) スレッドのスタック サイズ。 既定値は、このスレッドを生成するスレッドのスタックと同じサイズです。
(省略可) スレッドを作成するときに一時停止状態にするには CREATE_SUSPENDED を渡します。 既定値 0 では、スレッドを通常どおり起動します。
(省略可) セキュリティ属性。 既定では親スレッドと同じ値になります。 このセキュリティ情報の形式の詳細については、Windows SDK の「SECURITY_ATTRIBUTES」を参照してください。
AfxBeginThread は、スレッド生成処理の大部分を自動的に行います。 この関数は指定されたクラスのオブジェクトを生成し、パラメーターで指定されたとおりに初期化してから、CWinThread::CreateThread を呼び出してスレッドの実行を開始します。 なんらかの原因でスレッド生成に失敗すると、スレッド生成処理全体をチェックし、すべてのオブジェクトを確実に解放します。