アプリケーション内の実行中のスレッドを表します。
構文
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_CRITICALTHREAD_PRIORITY_HIGHESTTHREAD_PRIORITY_ABOVE_NORMALTHREAD_PRIORITY_NORMALTHREAD_PRIORITY_BELOW_NORMALTHREAD_PRIORITY_LOWESTTHREAD_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_CRITICALTHREAD_PRIORITY_HIGHESTTHREAD_PRIORITY_ABOVE_NORMALTHREAD_PRIORITY_NORMALTHREAD_PRIORITY_BELOW_NORMALTHREAD_PRIORITY_LOWESTTHREAD_PRIORITY_IDLE
これらの優先順位の詳細については、Windows SDK の SetThreadPriority を参照してください。
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0。
解説
これは、正常に戻 CreateThread 後にのみ呼び出すことができます。
CWinThread::SuspendThread
現在のスレッドの中断カウントをインクリメントします。
DWORD SuspendThread();
戻り値
成功した場合のスレッドの前の中断カウント。それ以外 0xFFFFFFFF 。
解説
いずれかのスレッドに 0 を超える中断カウントがある場合、そのスレッドは実行されません。 スレッドは、 ResumeThread メンバー関数を呼び出すことによって再開できます。