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
、
スレッドを作成するには、 AfxBeginThread
を呼び出します。 ワーカー スレッドとユーザー インターフェイス スレッドのどちらを使用するかに応じて、2 つのフォームがあります。 ユーザー インターフェイス スレッドが必要な場合は、CWinThread
派生クラスのCRuntimeClass
へのポインターをAfxBeginThread
渡します。 ワーカー スレッドを作成する場合は、制御関数へのポインターと制御関数へのパラメーターを AfxBeginThread
渡します。 ワーカー スレッドとユーザー インターフェイス スレッドの両方で、優先度、スタック サイズ、作成フラグ、およびセキュリティ属性を変更する省略可能なパラメーターを指定できます。 AfxBeginThread
は、新しい CWinThread
オブジェクトへのポインターを返します。
AfxBeginThread
を呼び出す代わりに、CWinThread
派生オブジェクトを構築してから、CreateThread
を呼び出すことができます。 この 2 段階の構築方法は、スレッド実行の連続した作成と終了の間で CWinThread
オブジェクトを再利用する場合に便利です。
CWinThread
の詳細については、「C++ と MFC を使用したマルチスレッド化、Multithreading: ユーザー インターフェイス スレッドの作成、マルチスレッド: ワーカー スレッドの作成、および Multithreading: 同期クラスの使用方法に関する記事を参照してください。
継承階層
CWinThread
要件
ヘッダー: afxwin.h
CWinThread::CreateThread
呼び出し元プロセスのアドレス空間内で実行するスレッドを作成します。
BOOL CreateThread(
DWORD dwCreateFlags = 0,
UINT nStackSize = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
パラメーター
dwCreateFlags
スレッドの作成を制御する追加のフラグを指定します。 このフラグは、2 つの値の 1 つを含めることができます。
CREATE_SUSPENDED
中断カウントが 1 のスレッドを開始します。 スレッドの実行を開始する前に、m_bAutoDelete
や派生クラスのメンバーなど、CWinThread
オブジェクトのメンバー データを初期化する場合は、CREATE_SUSPENDED
を使用します。 初期化が完了したら、CWinThread::ResumeThread
を使用してスレッドの実行を開始します。CWinThread::ResumeThread
が呼び出されるまでは、スレッドは実行されません。0 作成直後にスレッドを開始します。
nStackSize
新しいスレッドへのスタックのバイト サイズを指定します。 0場合、スタック サイズの既定値はプロセスのプライマリ スレッドと同じサイズになります。
lpSecurityAttrs
スレッドのセキュリティ属性を指定する SECURITY_ATTRIBUTES
構造体を指します。
戻り値
スレッドが正常に作成された場合は 0 以外。それ以外の場合は 0。
解説
AfxBeginThread
を使用してスレッド オブジェクトを作成し、1 つの手順で実行します。 スレッド実行の連続した作成と終了の間でスレッド オブジェクトを再利用する場合は、 CreateThread
を使用します。
CWinThread::CWinThread
CWinThread
オブジェクトを構築します。
CWinThread();
解説
スレッドの実行を開始するには、 CreateThread
メンバー関数を呼び出します。 通常は、このコンストラクターとCreateThread
を呼び出すAfxBeginThread
を呼び出してスレッドを作成します。
CWinThread::ExitInstance
ほとんどオーバーライドされない Run
メンバー関数内からフレームワークによって呼び出され、スレッドのこのインスタンスを終了したり、 InitInstance
の呼び出しが失敗した場合に呼び出されます。
virtual int ExitInstance();
戻り値
スレッドの終了コード。0 はエラーがないことを示し、0 より大きい値はエラーを示します。 この値は、 GetExitCodeThread
を呼び出すことによって取得できます。
解説
このメンバー関数は、 Run
メンバー関数内のどこからでも呼び出さないでください。 このメンバー関数は、ユーザー インターフェイス スレッドでのみ使用されます。
この関数の既定の実装では、m_bAutoDelete
がTRUE
されている場合、CWinThread
オブジェクトが削除されます。 スレッドが終了したときに追加のクリーンアップを実行する場合は、この関数をオーバーライドします。 ExitInstance
の実装では、コードの実行後に基底クラスのバージョンを呼び出す必要があります。
CWinThread::GetMainWnd
アプリケーションが OLE サーバーの場合は、この関数を呼び出して、アプリケーション オブジェクトの m_pMainWnd
メンバーを直接参照するのではなく、アプリケーションのアクティブなメイン ウィンドウへのポインターを取得します。
virtual CWnd* GetMainWnd();
戻り値
この関数は、2 種類のウィンドウのいずれかを指すポインターを返します。 スレッドが OLE サーバーの一部であり、アクティブなコンテナー内でインプレース アクティブなオブジェクトがある場合、この関数は、CWinThread
オブジェクトのCWinApp::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
派生クラスの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
デストラクターは、m_hThread
でCloseHandle
を呼び出します。 スレッドの終了時に m_bAutoDelete
が TRUE
されると、 CWinThread
オブジェクトが破棄され、 CWinThread
オブジェクトとそのメンバー変数へのポインターが無効になります。 スレッドの終了値を確認したり、シグナルを待機したりするには、 m_hThread
メンバーが必要な場合があります。 スレッドの実行中および終了後に CWinThread
オブジェクトとその m_hThread
メンバーを保持するには、スレッドの実行を続行する前に、 m_bAutoDelete
を FALSE
に設定します。 それ以外の場合、スレッドは終了し、 CWinThread
オブジェクトを破棄し、ハンドルを閉じてから使用を試みることがあります。 この手法を使用する場合は、 CWinThread
オブジェクトを削除する必要があります。
CWinThread::m_nThreadID
この CWinThread
にアタッチされているスレッドの ID。
DWORD m_nThreadID;
解説
m_nThreadID
データ メンバーは、DWORD
型のパブリック変数です。 基になるカーネル スレッド オブジェクトが現在存在する場合にのみ有効です。
m_hThread
有効期間に関する解説も参照してください。
例
AfxGetThread
の例を参照してください。
CWinThread::m_pActiveWnd
このデータ メンバーを使用して、スレッドのアクティブ ウィンドウ オブジェクトへのポインターを格納します。
CWnd* m_pActiveWnd;
解説
m_pActiveWnd
によって参照されるウィンドウが閉じられると、Microsoft Foundation クラス ライブラリによってスレッドが自動的に終了します。 このスレッドがアプリケーションのプライマリ スレッドである場合、アプリケーションも終了します。 このデータ メンバーが NULL
されている場合、アプリケーションの CWinApp
オブジェクトのアクティブ ウィンドウが継承されます。 m_pActiveWnd
は、 CWnd*
型のパブリック変数です。
通常、このメンバー変数は、 InitInstance
をオーバーライドするときに設定します。 ワーカー スレッドでは、このデータ メンバーの値は親スレッドから継承されます。
CWinThread::m_pMainWnd
このデータ メンバーを使用して、スレッドのメイン ウィンドウ オブジェクトへのポインターを格納します。
CWnd* m_pMainWnd;
解説
m_pMainWnd
によって参照されるウィンドウが閉じられると、Microsoft Foundation クラス ライブラリによってスレッドが自動的に終了します。 このスレッドがアプリケーションのプライマリ スレッドである場合、アプリケーションも終了します。 このデータ メンバーが 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 はメッセージまたはコマンド ハンドラーにディスパッチしません。 これらのメッセージを処理するには、CWinApp
派生クラスのPreTranslateMessage()
関数をオーバーライドし、メッセージを手動で処理します。
CWinThread::PreTranslateMessage
Windows 関数 TranslateMessage
および DispatchMessage
にディスパッチされる前にウィンドウ メッセージをフィルター処理するには、この関数をオーバーライドします。
virtual BOOL PreTranslateMessage(MSG* pMsg);
パラメーター
戻り値
メッセージが 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
構造体を指します。
戻り値
WM_CREATE
例外が生成された場合は -1。それ以外の場合は 0。
解説
このメンバー関数を直接呼び出さないでください。
このメンバー関数の既定の実装では、次のメッセージから生成された例外のみが処理されます。
command | アクション |
---|---|
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
は、アプリケーションが WM_QUIT
メッセージを受信するまで Windows メッセージを取得してディスパッチします。 スレッドのメッセージ キューに現在メッセージが含まれている場合、 Run
はアイドル時間の処理を実行するために OnIdle
を呼び出します。 受信メッセージは、特別な処理のために PreTranslateMessage
メンバー関数に移動し、標準のキーボード変換用の Windows 関数 TranslateMessage
に移動します。 最後に、 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
メンバー関数を呼び出すことによって再開できます。