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