Microsoft DirectX 8.0 |
CMsgThread クラスは、要求を非同期的に完了するために、キューを処理するスレッドのキューに入れるワーカー スレッド クラスである。このクラスを使用するには、このクラスからクラスを派生させ、CMsgThread::ThreadMessageProc メンバ関数をオーバーライドする。ThreadMessageProc メンバ関数は各要求を実行する。クライアント関数と ThreadMessageProc メンバ関数は、CMsg オブジェクトのパラメータについて共通の定義を共有しなければならない。
ネゴシエート メカニズムによって、ワーカー スレッドに終了が指示される。通常、これは CMsg クラスの uMsg メッセージ コードの値である。
派生クラスのデストラクタからこのメッセージを送信し、派生クラスの破棄が完了する前に CMsgThread::WaitForThreadExit メンバ関数を呼び出すことを推奨する。
Protected データ メンバ
m_hSem 通知に使用するハンドルを示す。 m_Lock リストへのアクセスを保護する。 m_lWaiting 空きスレッドを待機することを示す。 m_ThreadQueue CMsgThread::GetThreadMsg メンバ関数をオーバーライドし、このキュー以外をブロックする。
メンバ関数
CMsgThread CMsgThread オブジェクトを作成する。 CreateThread スレッドを作成する。 GetThreadHandle スレッド ハンドルを取得する。 GetThreadID スレッドの識別子を取得する。 GetThreadPriority 現在のスレッドの優先度を取得する。 PutThreadMsg ワーカー スレッドによって実行される要求をキューに入れる。 ResumeThread ワーカー スレッドの処理を続行する。 SetThreadPriority スレッドの優先度を新しい値に設定する。 SuspendThread 実行中のスレッドの処理をポーズする。 WaitForThreadExit CMsgThread::SuspendThread メンバ関数を呼び出した後、スレッドが終了するまでブロックする。
オーバーライド可能なメンバ関数
GetThreadMsg 要求を格納するキューに入れられた CMsg オブジェクトを取得する。 OnThreadInit スレッドについての初期化を提供する。 ThreadMessageProc 要求を処理する。これは純粋仮想メンバ関数である。
CMsgThread オブジェクトを作成する。
構文
CMsgThread(void);
戻り値
戻り値なし。
注意
メッセージ スレッド オブジェクトを作成しても、スレッドは自動的に作成されない。スレッドを作成するには、CMsgThread::CreateThread メンバ関数を呼び出す必要がある。
スレッドを作成する。
構文
BOOL CreateThread(void);
戻り値
次のいずれかの値を返す。
TRUE スレッドが正しく作成された。 FALSE スレッドが正しく作成されなかった。
注意
スレッドはループ処理を実行し、要求が CMsgThread::PutThreadMsg メンバ関数によってキューに入れられるまでブロックした後、各メッセージについて CMsgThread::ThreadMessageProc メンバ関数を呼び出す。
CMsgThread オブジェクト内のスレッドのハンドルを取得する。
構文
HANDLE GetThreadHandle(void);
戻り値
スレッド ハンドルを返す。
注意
スレッド ハンドルは、WaitForMultipleObjects などの Microsoft® Win32® アプリケーション プログラミング インターフェイス (API) 関数に渡すことができる。スレッド ハンドルは、スレッドが終了すると通知済になる。
スレッドの識別子を取得する。
構文
DWORD GetThreadID(void);
戻り値
プライベート データ メンバ m_ThreadId を返す。
注意
この関数は、ワーカー スレッドの Microsoft Win32 識別子を返す。ワーカー スレッドまたはクライアント スレッドのいずれかについて、このメンバ関数を呼び出すことができる。
要求を格納するキューに入れられた CMsg オブジェクトを取得する。
構文
void virtual GetThreadMsg( CMsg *msg );
パラメータ
- msg
- 割り当てられた CMsg オブジェクトへのポインタ。
注意
このメンバ関数は、ワーカー スレッドのプライベート関数 ThreadProc から呼び出されて、次のメンバ関数を取得する。msg パラメータは、キュー内の次の要求へのパラメータが格納される、割り当てられた CMsg オブジェクトを指す必要がある。キューに入れられた要求がない場合、このメンバ関数は CMsgThread::PutThreadMsg を呼び出して、次の要求がキューに入れられるまでブロックする。
Microsoft Win32 GetThreadPriority 関数を使用して、現在のワーカー スレッドの優先度を取得する。
構文
int GetThreadPriority(void);
戻り値
スレッドの優先度を整数として返す。
スレッドについての初期化を提供する。
構文
virtual void OnThreadInit(void);
戻り値
戻り値なし。
注意
スレッドの起動時に独自の初期化を実行する場合は、この関数をオーバーライドする。
ワーカー スレッドによって実行される要求をキューに入れる。
構文
void PutThreadMsg( UINT uMsg, DWORD dwMsgFlags, LPVOID lpMsgParam, CAMEvent *pEvent = NULL );
パラメータ
- uMsg
- 要求コード。
- dwMsgFlags
- オプションのフラグ パラメータ。
- lpMsgParam
- 追加のパラメータまたは戻り値を格納するデータ ブロックへのオプションのポインタ。静的またはヒープによって割り当てられていなければならず、自動的であってはならない。
- pEvent
- 完了時に通知済になるイベント オブジェクトへのオプションのポインタ。
戻り値
戻り値なし。
注意
このメンバ関数は、ワーカー スレッドによって実行される要求をキューに入れる。このメンバ関数のパラメータは CMsg オブジェクトとしてキューに入れられ、ワーカー スレッドの CMsgThread::ThreadMessageProc メンバ関数に渡される。このメンバ関数は要求をキューに入れた後、直ちに戻り、スレッドが要求を実行するまで待機しない。派生クラスの CMsgThread::ThreadMessageProc メンバ関数で 4 つのパラメータを定義する。
このメンバ関数はマルチスレッドで安全なリストを使用するので、異なるスレッドからこのメンバ関数を安全に複数呼び出すことができる。
Microsoft Win32 ResumeThread 関数を使用して、以前に CMsgThread::SuspendThread メンバ関数を呼び出した後のワーカー スレッドの処理を続行する。
構文
DWORD ResumeThread(void);
戻り値
このメンバ関数が成功した場合、戻り値は以前のスレッドのポーズ カウントである。このメンバ関数が失敗した場合、戻り値は 0xFFFFFFFF である。拡張エラー情報を取得するには、Microsoft Win32 GetLastError 関数を呼び出す。
Microsoft Win32 SetThreadPriority 関数を使用して、スレッドの優先度を新しい値に設定する。
構文
BOOL SetThreadPriority( int nPriority );
パラメータ
- nPriority
- スレッドの優先度。
戻り値
次のいずれかの値を返す。
TRUE 優先度が正しく設定された。 FALSE 優先度が設定されなかった。
注意
クライアントおよびワーカー スレッドはこのメンバ関数を呼び出すことができる。
Microsoft Win32 SuspendThread 関数を使用して、実行中のスレッドの処理をポーズする。
構文
DWORD SuspendThread(void);
戻り値
このメンバ関数が成功した場合、戻り値は以前のスレッドのポーズ カウントである。このメンバ関数が失敗した場合、戻り値は 0xFFFFFFFF である。拡張エラー情報を取得するには、Microsoft Win32 GetLastError 関数を呼び出す。
注意
クライアントはこのメンバ関数を呼び出して、ワーカー スレッドの処理をポーズする。ワーカー スレッドはポーズされ、CMsgThread::ResumeThread メンバ関数が次に呼び出されるまで実行されない。
要求を処理する。これは純粋仮想メンバ関数である。
構文
virtual LRESULT ThreadMessageProc( UINT uMsg, DWORD dwFlags, LPVOID lpParam, CAMEvent *pEvent );
パラメータ
- uMsg
- 要求コード。
- dwFlags
- 要求に対するオプションのフラグ パラメータ。
- lpParam
- 追加のデータまたは戻りデータ ブロックへのオプションのポインタ。
- pEvent
- イベント オブジェクトへのオプションのポインタ。
戻り値
戻り値が 0 以外の場合、スレッドは終了する。終了要求が最近処理されたばかりである場合以外は、0 を返す。
注意
この純粋仮想関数は派生クラスでオーバーライドしなければならない。このメンバ関数は、CMsgThread::PutThreadMsg メンバ関数の呼び出しによってキューに入れられた各要求について 1 回呼び出される。
このメンバ関数は 4 つのパラメータを定義する。通常、uMsg パラメータを使用して要求を指定し、ほかの 3 つのパラメータはオプションの追加パラメータである。呼び出し元アプリケーションで必要な場合は、pEvent パラメータで CAMEvent オブジェクトへのポインタを指定できる。このイベントは、イベントを処理した後で、次のような式を使用して設定できる。
pEvent->SetEventワーカー スレッドに終了を指示するために、1 つの要求コードを別に設定しなければならない。この要求を受信したら、このメンバ関数から 1 を返す。ワーカー スレッドを終了しない場合は 0 を返す。
スレッドが終了するまでブロックする。
構文
BOOL WaitForThreadExit( LPDWORD lpdwExitCode );
パラメータ
- lpdwExitCode
- スレッドによって返された終了コードへのポインタ。
戻り値
TRUE または FALSE のいずれかを返す。これらの意味はオーバーライドされた CMsgThread::ThreadMessageProc メンバ関数を提供するクラスおよび呼び出し元のメンバ関数によって決まる。
注意
派生クラスの破棄を完了する前に、ワーカー スレッドが完全に終了していることを確認する。そうしないと、ダイナミックリンク ライブラリ (DLL) がプロセスのアドレス空間からアンロードされた後もスレッドが実行されることになる。終了せずに残った命令が戻り値 1 つの命令であっても、これは例外を発生させる。スレッドが終了していることを確認する確実な方法は、( CMsgThread::PutThreadMsg メンバ関数に送信される、プライベートにネゴシエートした CMsg オブジェクトを使用して) スレッドに終了するように通知した後、このメンバ関数を呼び出す方法だけである。派生クラスのデストラクタでこの処理を行う必要がある。