CWinThread クラス

アプリケーション内の実行中のスレッドを表します。

構文

class CWinThread : public CCmdTarget

メンバー

パブリック コンストラクター

名前 説明
CWinThread::CWinThread CWinThread オブジェクトを構築します。

パブリック メソッド

名前 説明
CWinThread::CreateThread オブジェクトの実行を CWinThread 開始します。
CWinThread::ExitInstance スレッドが終了したときにクリーンにオーバーライドします。
CWinThread::GetMainWnd スレッドのメイン ウィンドウへのポインターを取得します。
CWinThread::GetThreadPriority 現在のスレッドの優先度を取得します。
CWinThread::InitInstance スレッド インスタンスの初期化を実行するためにオーバーライドします。
CWinThread::IsIdleMessage 特殊なメッセージをチェックします。
CWinThread::OnIdle スレッド固有のアイドル時間処理を実行する場合にオーバーライドします。
CWinThread::PostThreadMessage メッセージを別 CWinThread のオブジェクトに投稿します。
CWinThread::PreTranslateMessage Windows 関数 TranslateMessage にディスパッチされる前にメッセージをフィルター処理します DispatchMessage
CWinThread::ProcessMessageFilter アプリケーションに到達する前に、特定のメッセージをインターセプトします。
CWinThread::ProcessWndProcException スレッドのメッセージおよびコマンド ハンドラーによってスローされたすべてのハンドルされない例外をインターセプトします。
CWinThread::PumpMessage スレッドのメッセージ ループを格納します。
CWinThread::ResumeThread スレッドの中断カウントをデクリメントします。
CWinThread::Run メッセージ ポンプを使用したスレッドの制御機能。 既定のメッセージ ループをカスタマイズするには、オーバーライドします。
CWinThread::SetThreadPriority 現在のスレッドの優先度を設定します。
CWinThread::SuspendThread スレッドの中断カウントをインクリメントします。

パブリック演算子

名前 説明
CWinThread::operator HANDLE オブジェクトのハンドルを CWinThread 取得します。

パブリック データ メンバー

名前 説明
CWinThread::m_bAutoDelete スレッド終了時にオブジェクトを破棄するかどうかを指定します。
CWinThread::m_hThread 現在のスレッドへのハンドル。
CWinThread::m_nThreadID 現在のスレッドの ID。
CWinThread::m_pActiveWnd OLE サーバーがインプレース アクティブな場合にコンテナー アプリケーションのメイン ウィンドウへのポインター。
CWinThread::m_pMainWnd アプリケーションのメイン ウィンドウへのポインターを保持します。

解説

実行のメイン スレッドは、通常、; CWinApp から派生したCWinAppオブジェクトによって提供されますCWinThread。 追加の CWinThread オブジェクトを使用すると、特定のアプリケーション内で複数のスレッドを使用できます。

サポートされる CWinThread スレッドには、ワーカー スレッドとユーザー インターフェイス スレッドの 2 つの一般的な種類があります。 ワーカー スレッドにはメッセージ ポンプがありません。たとえば、スプレッドシート アプリケーションでバックグラウンド計算を実行するスレッドなどです。 ユーザー インターフェイス スレッドにはメッセージ ポンプがあり、システムから受信したメッセージを処理します。 CWinApp およびそこから派生したクラスは、ユーザー インターフェイス スレッドの例です。 他のユーザー インターフェイス スレッドから直接 CWinThread派生することもできます。

クラス CWinThread のオブジェクトは、通常、スレッドの期間中存在します。 この動作を変更する場合は、次に設定 m_bAutoDelete します FALSE

CWinThreadこのクラスは、コードと MFC を完全にスレッド セーフにするために必要です。 スレッド固有の情報をメインするためにフレームワークによって使用されるスレッド ローカル データは、オブジェクトによってCWinThread管理されます。 このスレッド ローカル データの処理に CWinThread 依存するため、MFC を使用するすべてのスレッドを MFC で作成する必要があります。 たとえば、ランタイム関数 _beginthreadによって作成されたスレッドでは、 _beginthreadex MFC API を使用できません。

スレッドを作成するには、次を呼び出します AfxBeginThread。 ワーカー スレッドとユーザー インターフェイス スレッドのどちらを使用するかに応じて、2 つのフォームがあります。 ユーザー インターフェイス スレッドが必要な場合は、-derived クラスのCWinThreadポインターにCRuntimeClassAfxBeginThreadします。 ワーカー スレッドを作成する場合は、制御関数への AfxBeginThread ポインターと制御関数へのパラメーターを渡します。 ワーカー スレッドとユーザー インターフェイス スレッドの両方で、優先度、スタック サイズ、作成フラグ、およびセキュリティ属性を変更する省略可能なパラメーターを指定できます。 AfxBeginThread は、新しい CWinThread オブジェクトへのポインターを返します。

呼び出すAfxBeginThread代わりに、-derived オブジェクトをCWinThread構築し、次に .CreateThread この 2 段階の構築方法は、連続する作成とスレッド実行の終了の間で CWinThread オブジェクトを再利用する場合に便利です。

詳細については、「C++ と MFC を使用したマルチスレッド」、マルチスレッド: ユーザー インターフェイス スレッドの作成、マルチスレッド: ワーカー スレッドの作成、マルチスレッド: 同期クラスの使用方法に関CWinThreadする記事を参照してください。

継承階層

CObject

CCmdTarget

CWinThread

必要条件

ヘッダー:afxwin.h

CWinThread::CreateThread

呼び出し元プロセスのアドレス空間内で実行するスレッドを作成します。

BOOL CreateThread(
    DWORD dwCreateFlags = 0,
    UINT nStackSize = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);

パラメーター

dwCreateFlags
スレッドの作成を制御する追加のフラグを指定します。 このフラグは、2 つの値の 1 つを含めることができます。

  • CREATE_SUSPENDED 中断カウントが 1 のスレッドを開始します。 スレッドの実行を開始する前に、オブジェクトのCWinThreadメンバー データ (派生クラスのメンバーなどm_bAutoDelete) を初期化する場合に使用CREATE_SUSPENDEDします。 初期化が完了したら、スレッドの実行を CWinThread::ResumeThread 開始するために使用します。 CWinThread::ResumeThread が呼び出されるまでは、スレッドは実行されません。

  • 0 作成直後にスレッドを開始します。

nStackSize
新しいスレッドへのスタックのバイト サイズを指定します。 0 の場合、スタック サイズの既定値はプロセスのプライマリ スレッドと同じサイズになります。

lpSecurityAttrs
スレッドの SECURITY_ATTRIBUTES セキュリティ属性を指定する構造体を指します。

戻り値

スレッドが正常に作成された場合は 0 以外。それ以外の場合は 0。

解説

スレッド オブジェクトを作成し、1 つの手順で実行するために使用 AfxBeginThread します。 スレッド実行の連続した作成と終了の間にスレッド オブジェクトを再利用する場合に使用 CreateThread します。

CWinThread::CWinThread

CWinThread オブジェクトを構築します。

CWinThread();

解説

スレッドの実行を開始するには、メンバー関数を CreateThread 呼び出します。 通常は、このコンストラクターを呼び出す呼び出し AfxBeginThreadによってスレッドを作成します CreateThread

CWinThread::ExitInstance

ほとんどオーバーライド Run されないメンバー関数内からフレームワークによって呼び出され、スレッドのこのインスタンスを終了するか、呼び出し InitInstance が失敗した場合に呼び出されます。

virtual int ExitInstance();

戻り値

スレッドの終了コード。0 はエラーがないことを示し、0 より大きい値はエラーを示します。 この値は、呼び出 GetExitCodeThreadすことによって取得できます。

解説

メンバー関数内の任意の場所からこのメンバー関数を Run 呼び出さないでください。 このメンバー関数は、ユーザー インターフェイス スレッドでのみ使用されます。

この関数の既定の実装では、次の場合m_bAutoDeleteTRUEにオブジェクトがCWinThread削除されます。 スレッドが終了したときに追加のクリーンを実行する場合は、この関数をオーバーライドします。 実装では、コードの ExitInstance 実行後に基底クラスのバージョンを呼び出す必要があります。

CWinThread::GetMainWnd

アプリケーションが OLE サーバーの場合は、この関数を呼び出して、アプリケーション オブジェクトのメンバーを直接参照するのではなく、アプリケーションのアクティブなメイン ウィンドウへのm_pMainWndポインターを取得します。

virtual CWnd* GetMainWnd();

戻り値

この関数は、2 種類のウィンドウのいずれかを指すポインターを返します。 スレッドが OLE サーバーの一部であり、アクティブなコンテナー内でインプレース アクティブなオブジェクトがある場合、この関数はオブジェクトのデータ メンバーをCWinThreadCWinApp::m_pActiveWndします。

コンテナー内にインプレース アクティブなオブジェクトがない場合、またはアプリケーションが OLE サーバーでない場合、この関数はスレッド オブジェクトのデータ メンバーを返 m_pMainWnd します。

解説

ユーザー インターフェイス スレッドの場合、これはアプリケーション オブジェクトのメンバーを直接参照することと m_pActiveWnd 同じです。

開発中のアプリケーションが OLE サーバーではない場合は、この関数を呼び出すことは、アプリケーション オブジェクトの m_pMainWnd メンバーを直接参照することと同じです。

既定の動作を変更するには、この関数をオーバーライドします。

CWinThread::GetThreadPriority

このスレッドの現在のスレッド優先度レベルを取得します。

int GetThreadPriority();

戻り値

その優先度クラス内の現在のスレッドの優先度レベル。 返される値は、優先度が最も高いものから最も低いものまで、次のいずれかになります。

  • THREAD_PRIORITY_TIME_CRITICAL

  • THREAD_PRIORITY_HIGHEST

  • THREAD_PRIORITY_ABOVE_NORMAL

  • THREAD_PRIORITY_NORMAL

  • THREAD_PRIORITY_BELOW_NORMAL

  • THREAD_PRIORITY_LOWEST

  • THREAD_PRIORITY_IDLE

これらの優先順位の詳細については、Windows SDK を参照してください SetThreadPriority

CWinThread::InitInstance

InitInstance は、ユーザー インターフェイス スレッドの各新しいインスタンスを初期化するためにオーバーライドする必要があります。

virtual BOOL InitInstance();

戻り値

初期化が成功した場合は 0 以外。それ以外の場合は 0。

解説

通常、オーバーライドして InitInstance 、スレッドの作成時に完了する必要があるタスクを実行します。

このメンバー関数は、ユーザー インターフェイス スレッドでのみ使用されます。 渡される AfxBeginThread制御関数でワーカー スレッドの初期化を実行します。

CWinThread::IsIdleMessage

特定のメッセージが生成された後に呼び出されないようにするには OnIdle 、この関数をオーバーライドします。

virtual BOOL IsIdleMessage(MSG* pMsg);

パラメーター

pMsg
処理中の現在のメッセージを指します。

戻り値

メッセージの処理後に呼び出す必要がある場合 OnIdle は 0 以外、それ以外の場合は 0。

解説

既定の実装では、カレットの点滅によって生成された冗長なマウス メッセージとメッセージの後には呼び出 OnIdle されません。

アプリケーションが短いタイマーを作成した場合、 OnIdle 頻繁に呼び出され、パフォーマンスの問題が発生します。 このようなアプリケーションのパフォーマンスを向上させるには、アプリケーションの CWinApp-derived クラスでオーバーライドIsIdleMessageして、メッセージを次のようにチェックWM_TIMERします。

BOOL CMyWinApp::IsIdleMessage(MSG* pMsg)
{
   if (!CWinApp::IsIdleMessage(pMsg) || pMsg->message == WM_TIMER)
      return FALSE;
   else
      return TRUE;
}

この方法で処理 WM_TIMER すると、短いタイマーを使用するアプリケーションのパフォーマンスが向上します。

CWinThread::m_bAutoDelete

スレッドの終了時に CWinThread オブジェクトを自動的に削除するかどうかを指定します。

BOOL m_bAutoDelete;

解説

m_bAutoDeleteデータ メンバーは、BOOL 型のパブリック変数です。

m_bAutoDelete は、基になるスレッド ハンドルの閉じ方には影響しませんが、ハンドルを閉じるタイミングには影響します。 スレッド ハンドルは、CWinThread オブジェクトが破棄されるときに必ず閉じられます。

CWinThread::m_hThread

これに CWinThreadアタッチされているスレッドへのハンドル。

HANDLE m_hThread;

解説

データ メンバーは m_hThread 、型 HANDLEのパブリック変数です。 基になるカーネル スレッド オブジェクトが現在存在し、ハンドルがまだ閉じていない場合にのみ有効です。

デストラクターでCWinThread呼び出されますCloseHandlem_hThreadTRUEスレッドが終了した場合m_bAutoDeleteCWinThreadオブジェクトは破棄され、オブジェクトとそのメンバー変数へのCWinThreadポインターが無効になります。 スレッド終了値をm_hThreadチェックしたり、シグナルを待機したりするメンバーが必要になる場合があります。 スレッドのCWinThread実行中および終了後にオブジェクトとそのm_hThreadメンバーを保持するには、スレッドの実行をFALSE続行する前に設定m_bAutoDeleteします。 それ以外の場合は、スレッドを終了し、オブジェクトを CWinThread 破棄し、ハンドルを閉じてから使用を試みることがあります。 この手法を使用する場合は、オブジェクトを削除する CWinThread 必要があります。

CWinThread::m_nThreadID

これに CWinThreadアタッチされているスレッドの ID。

DWORD m_nThreadID;

解説

データ メンバーは m_nThreadID 、型 DWORDのパブリック変数です。 基になるカーネル スレッド オブジェクトが現在存在する場合にのみ有効です。 有効期間に関する m_hThread 解説も参照してください。

AfxGetThread の例を参照してください。

CWinThread::m_pActiveWnd

このデータ メンバーを使用して、スレッドのアクティブ ウィンドウ オブジェクトへのポインターを格納します。

CWnd* m_pActiveWnd;

解説

Microsoft Foundation クラス ライブラリは、参照されるウィンドウが閉じられると、スレッドを自動的に m_pActiveWnd 終了します。 このスレッドがアプリケーションのプライマリ スレッドである場合、アプリケーションも終了します。 このデータ メンバーが存在する場合、 NULLアプリケーションのオブジェクトの CWinApp アクティブ ウィンドウが継承されます。 m_pActiveWnd は型 CWnd*のパブリック変数です。

通常は、オーバーライド InitInstanceするときにこのメンバー変数を設定します。 ワーカー スレッドでは、このデータ メンバーの値は親スレッドから継承されます。

CWinThread::m_pMainWnd

このデータ メンバーを使用して、スレッドのメイン ウィンドウ オブジェクトへのポインターを格納します。

CWnd* m_pMainWnd;

解説

Microsoft Foundation クラス ライブラリは、参照されるウィンドウが閉じられると、スレッドを自動的に m_pMainWnd 終了します。 このスレッドがアプリケーションのプライマリ スレッドである場合、アプリケーションも終了します。 このデータ メンバーが存在する場合はNULL、アプリケーションのオブジェクトのCWinAppメイン ウィンドウを使用して、スレッドを終了するタイミングを決定します。 m_pMainWnd は型 CWnd*のパブリック変数です。

通常は、オーバーライド InitInstanceするときにこのメンバー変数を設定します。 ワーカー スレッドでは、このデータ メンバーの値は親スレッドから継承されます。

CWinThread::OnIdle

アイドル時間処理を実行するには、このメンバー関数をオーバーライドします。

virtual BOOL OnIdle(LONG lCount);

パラメーター

lCount
スレッドのメッセージ キューが空のときに、毎回 OnIdle インクリメントされるカウンターが呼び出されます。 この数は、新しいメッセージが処理されるたびに 0 にリセットされます。 このパラメーターを lCount 使用すると、メッセージを処理せずにスレッドがアイドル状態になった時間の相対的な長さを判断できます。

戻り値

より多くのアイドル処理時間を受信する場合は 0 以外。これ以上アイドル処理時間が必要ない場合は 0。

解説

OnIdle は、スレッドのメッセージ キューが空の場合に、既定のメッセージ ループで呼び出されます。 オーバーライドを使用して、独自のバックグラウンド アイドル ハンドラー タスクを呼び出します。

OnIdle は、追加のアイドル処理時間が不要であることを示す 0 を返す必要があります。 パラメーターは lCount 、メッセージ キューが空のときに呼び出されるたびにインクリメント OnIdle され、新しいメッセージが処理されるたびに 0 にリセットされます。 この数に基づいて、異なるアイドル ルーチンを呼び出すことができます。

このメンバー関数の既定の実装では、一時オブジェクトと未使用のダイナミック リンク ライブラリがメモリから解放されます。

このメンバー関数は、ユーザー インターフェイス スレッドでのみ使用されます。

アプリケーションは戻るまで OnIdle メッセージを処理できないため、この関数では長いタスクを実行しないでください。

CWinThread::operator HANDLE

オブジェクトのハンドルを CWinThread 取得します。

operator HANDLE() const;

戻り値

成功した場合は、スレッド オブジェクトのハンドル。それ以外の場合は . NULL

解説

ハンドルを使用して Windows API を直接呼び出します。

CWinThread::PostThreadMessage

ユーザー定義メッセージを別 CWinThread のオブジェクトに投稿するために呼び出されます。

BOOL PostThreadMessage(
    UINT message,
    WPARAM wParam,
    LPARAM lParam);

パラメーター

message
ユーザー定義メッセージの ID。

wParam
最初のメッセージ パラメーター。

lParam
2 番目のメッセージ パラメーター。

戻り値

正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。

解説

投稿されたメッセージは、メッセージ マップ マクロ ON_THREAD_MESSAGEによって適切なメッセージ ハンドラーにマップされます。

Note

呼び出 PostThreadMessageすと、メッセージはスレッドのメッセージ キューに配置されます。 ただし、この方法で投稿されたメッセージはウィンドウに関連付けられていないため、MFC はメッセージまたはコマンド ハンドラーにディスパッチしません。 これらのメッセージを処理するには、-derived クラスの関数をCWinAppオーバーライドPreTranslateMessage()し、メッセージを手動で処理します。

CWinThread::PreTranslateMessage

Windows 関数にディスパッチされる前にウィンドウ メッセージをフィルター処理するには、この関数 TranslateMessage をオーバーライドします DispatchMessage

virtual BOOL PreTranslateMessage(MSG* pMsg);

パラメーター

pMsg
処理するメッセージを MSG 含む構造体 を指します。

戻り値

メッセージが完全に処理され PreTranslateMessage 、それ以上処理すべきでない場合は 0 以外。 メッセージを通常の方法で処理する必要がある場合は 0。

解説

このメンバー関数は、ユーザー インターフェイス スレッドでのみ使用されます。

CWinThread::ProcessMessageFilter

フレームワークのフック関数は、このメンバー関数を呼び出して、特定の Windows メッセージをフィルター処理して応答します。

virtual BOOL ProcessMessageFilter(
    int code,
    LPMSG lpMsg);

パラメーター

code
フック コードを指定します。 このメンバー関数は、コードを使用して処理 lpMsg方法を決定します。

lpMsg
Windows MSG 構造体へのポインター。

戻り値

メッセージが処理される場合は 0 以外。それ以外の場合は 0。

解説

フック関数は、アプリケーションの通常のメッセージ処理に送信される前にイベントを処理します。

この高度な機能をオーバーライドする場合は、必ず基底クラス バージョンを呼び出して、フレームワークのフック処理をメインします。

CWinThread::ProcessWndProcException

フレームワークは、ハンドラーがスレッドのメッセージまたはコマンド ハンドラーのいずれかでスローされた例外をキャッチしない場合に常に、このメンバー関数を呼び出します。

virtual LRESULT ProcessWndProcException(
    CException* e,
    const MSG* pMsg);

パラメーター

e
ハンドルされない例外を指します。

pMsg
フレームワークが例外を MSG スローする原因となった Windows メッセージに関する情報を含む構造体 を指します。

戻り値

例外が生成された場合 WM_CREATE は -1。それ以外の場合は 0。

解説

このメンバー関数を直接呼び出さないでください。

このメンバー関数の既定の実装では、次のメッセージから生成された例外のみが処理されます。

コマンド アクション
WM_CREATE 失敗。
WM_PAINT 影響を受けるウィンドウを検証し、別 WM_PAINT のメッセージが生成されないようにします。

例外のグローバル処理を提供するには、このメンバー関数をオーバーライドします。 既定の動作を表示する場合にのみ、基本機能を呼び出します。

このメンバー関数は、メッセージ ポンプがあるスレッドでのみ使用されます。

CWinThread::PumpMessage

スレッドのメッセージ ループを格納します。

virtual BOOL PumpMessage();

解説

PumpMessage にはスレッドのメッセージ ループが含まれています。 PumpMessage は、スレッドのメッセージをポンプするために CWinThread 呼び出されます。 メッセージを強制的に処理するために直接呼び出 PumpMessage すか、オーバーライド PumpMessage して既定の動作を変更できます。

直接呼び出 PumpMessage して既定の動作をオーバーライドすることは、上級ユーザーにのみ推奨されます。

CWinThread::ResumeThread

メンバー関数によって中断されたスレッド、またはフラグを使用して SuspendThread 作成されたスレッドの実行を CREATE_SUSPENDED 再開するために呼び出されます。

DWORD ResumeThread();

戻り値

成功した場合のスレッドの前の中断カウント。 0xFFFFFFFF それ以外の場合。 戻り値が 0 の場合、現在のスレッドは中断されませんでした。 戻り値が 1 の場合、スレッドは中断されましたが、現在は再起動されます。 戻り値が 1 より大きい場合は、スレッドが中断メインを意味します。

解説

現在のスレッドの中断数が 1 つ減ります。 中断回数が 0 に減ると、スレッドは実行を再開します。それ以外の場合は、スレッドが中断メイン。

CWinThread::Run

ユーザー インターフェイス スレッドの既定のメッセージ ループを提供します。

virtual int Run();

戻り値

intスレッドによって返される値。 この値は、呼び出 GetExitCodeThreadすことによって取得できます。

解説

Run は、アプリケーションがメッセージを受信するまで Windows メッセージを WM_QUIT 取得してディスパッチします。 スレッドのメッセージ キューに現在メッセージが含まれている場合は、 Run アイドル時間処理を実行する呼び出し OnIdle 。 受信メッセージは、特別な処理のためにメンバー関数に移動し、標準のキーボード変換用の Windows 関数TranslateMessageに移動PreTranslateMessageします。 最後に、 DispatchMessage Windows 関数が呼び出されます。

Run がオーバーライドされることはほとんどありませんが、特別な動作を実装するためにオーバーライドできます。

このメンバー関数は、ユーザー インターフェイス スレッドでのみ使用されます。

CWinThread::SetThreadPriority

この関数は、その優先度クラス内の現在のスレッドの優先度レベルを設定します。

BOOL SetThreadPriority(int nPriority);

パラメーター

nPriority
その優先度クラス内の新しいスレッド優先度レベルを指定します。 このパラメーターは、優先順位が最も高いものから最も低いものまで、次のいずれかの値である必要があります。

  • THREAD_PRIORITY_TIME_CRITICAL

  • THREAD_PRIORITY_HIGHEST

  • THREAD_PRIORITY_ABOVE_NORMAL

  • THREAD_PRIORITY_NORMAL

  • THREAD_PRIORITY_BELOW_NORMAL

  • THREAD_PRIORITY_LOWEST

  • THREAD_PRIORITY_IDLE

これらの優先順位の詳細については、Windows SDK を参照してください SetThreadPriority

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0。

解説

正常に戻った後 CreateThread にのみ呼び出すことができます。

CWinThread::SuspendThread

現在のスレッドの中断カウントをインクリメントします。

DWORD SuspendThread();

戻り値

成功した場合のスレッドの前の中断カウント。 0xFFFFFFFF それ以外の場合。

解説

いずれかのスレッドに 0 を超える中断カウントがある場合、そのスレッドは実行されません。 スレッドは、メンバー関数を ResumeThread 呼び出すことによって再開できます。

関連項目

CCmdTarget クラス
階層図
CWinApp クラス
CCmdTarget クラス