Microsoft DirectX 8.0 |
ワーカー スレッドを管理する抽象クラス。
宣言 : Wxutil.h
このクラスはワーカー スレッドの作成、そのスレッドへのリクエストの送信、そのスレッドの終了の待機を提供する。このクラスの使用方法は次のとおり :
スレッドでの処理が終了したら、Close メソッドを呼び出す。このメソッドはスレッドの終了を待機し、スレッド ハンドルを閉じる。ThreadProc メッセージはそれ自身であれ、CallWorker リクエストへの応答であれ、終了を保証するものでなければならない。デストラクタ メソッドもまた Close を呼び出す。
次の例はこのステップを示す。
class MyThread : public CAMThread { protected: DWORD ThreadProc(void); }; DWORD MyThread::ThreadProc() { BOOL bShutDown = FALSE; while (!bShutDown) { DWORD req = GetRequest(); printf("Request: %d\n", req); bShutDown = (req == 0); Reply(bShutDown ? S_FALSE : S_OK); } printf("Quitting Thread\n"); return 1; } void main() { MyThread thread; DWORD reply; thread.Create(); reply = thread.CallWorker(3); reply = thread.CallWorker(0); // スレッド終了 }
派生したクラスで、CallWorker のパラメータを有効にするメンバ関数を定義することもできる。次の例はこれの一般的な方法を示す。
enum Command {CMD_INIT, CMD_RUN, CMD_STOP, CMD_EXIT}; HRESULT Init(void) { return CallWorker(CMD_INIT); } HRESULT Run(void) { return CallWorker(CMD_RUN); } HRESULT Stop(void) { return CallWorker(CMD_STOP); } HRESULT Exit(void) { return CallWorker(CMD_EXIT); }
CAMThread クラスはパブリック メンバ変数として 2 つのクリティカル セクションを提供する。m_AccessLock を使って、他のスレッドからアクセスされているスレッドをロックする。(たとえば、Create と CallWorker メソッドはこのロックを保持し、スレッドの操作を継続する。) m_WorkerLock を使い、スレッド間で共有されているデータをロックする。
Protected メンバ変数 | |
---|---|
m_hThread | スレッドのハンドル。 |
Public メンバ関数 | |
m_AccessLock | 他のスレッドからアクセスされてるスレッドをロックするクリティカル セクション。 |
m_WorkerLock | スレッド間で共有されているデータをロックするクリティカル セクション。 |
Public メソッド | |
CAMThread | コンストラクタ メソッド。 |
~CAMThread | デストラクタ メソッド。仮想。 |
InitialThreadProc | スレッドが作成されたとき ThreadProc メソッドを呼び出す。 |
Create | スレッドの作成。 |
CallWorker | スレッドにリクエストを通知する。 |
Close | スレッドの終了を待ち、そのリソースを解放する。 |
ThreadExists | スレッドが終了したかどうかを調べる。 |
GetRequest | 次のリクエストを待つ。 |
CheckRequest | リクエストがあれば、ブロッキングなしでチェックする。 |
Reply | リクエストに応答する。 |
GetRequestHandle | CallWorker メソッドで通知済のイベントのハンドルを取得する。 |
GetRequestParam | 最新のリクエストを取得する。 |
CoInitializeHelper | スレッドの開始時に CoInitializeEx を呼び出す。 |
純粋な仮想メソッド | |
ThreadProc | スレッド プロシージャ。 |
他のスレッドからアクセスされているスレッドをロックするクリティカル セクション。
構文
CCritSec m_AccessLock;
注意
Create と CallWorker メソッドはこのロックを保持し、スレッドの操作を継続する。
スレッド間で共有されているデータをロックするクリティカル セクション
構文
CCritSec m_WorkerLock;
スレッドのハンドル
構文
HANDLE m_hThread;
注意
この変数は NULL で初期化される。Create メソッドはこの変数をスレッド ハンドルに設定する。スレッドが終了したかどうかを見極めるには、ThreadExists メソッドを呼び出す。
コンストラクタ メソッド。
構文
CAMThread(void);
注意
このコンストラクタ メソッドはスレッドを作成しない。スレッドを作成するには Create を呼び出す。
デストラクタ メソッド
構文
virtual ~CAMThread(void);
注意
このデストラクタ メソッドは Close メソッドを呼び出す、このメソッドはスレッドの終了を待つ。
スレッドにリクエストを通知する。
構文
DWORD CallWorker( DWORD dwParam );
パラメータ
- dwParam
- リクエスト パラメータ。この派生クラスはパラメータの意味を定義する。
戻り値
派生クラスが定義した値を返す。
注意
GetRequest と CheckRequest メソッドは dwParam パラメータの値を取得する。GetRequest メソッドは CallWorker が呼び出されるまでブロックする。
このメソッドは Reply メソッドが呼び出されるまでブロックする。戻り値は Reply によって与えられたパラメータ。
このメソッドは m_AccessLock ロックをホールドし、リクエストを継続する。したがって、スレッドからあるいはスレッドのコンテクストを実行するメンバ関数からこのメソッドを呼び出す。
リクエストがあれば、ブロッキングなしでチェックする。
構文
BOOL CheckRequest( DWORD *pParam );
パラメータ
- pParam
- CallWorker メソッドの最後の呼び出しに通した値を受け取る変数のポインタ。
戻り値
未処理のリクエストがあれば TRUE を、それ以外なら FALSE を返す。
注意
このメソッドは GetRequest の非ブロッキング版である。
他のスレッドが CallWorker の呼び出しを待っているなら、このメソッドはリクエストパラメータを取得し、TRUE を返す。それ以外の場合、FALSE を返す。このメソッドが TRUE を返したら、Reply メソッドを呼び出し、スレッドのリクエストを取得する。
スレッドの終了を待ち、そのリソースを解放する。
構文
void Close(void);
戻り値
戻り値なし。
注意
このメソッドを呼び出す前に、スレッドが終了できるようにしなければならない。たとえば ThreadProc メソッドを使って、スレッドに対して終了を通知するリクエストを定義する。次に CAMThread::CallWorker メソッドをその値で呼び出す。
The ~CAMThread デストラクタ メソッドはこのメソッドを呼び出す。
スレッドの作成。
構文
BOOL Create(void);
戻り値
成功すれば TRUE を返し、それ以外なら FALSE を返す。
注意
このメソッドはスレッドを作成する、その際スレッド プロシ−ジャとして InitialThreadProc メソッドを、スレッド引数として this を使用する。
このメソッドはスレッドが既にある場合失敗する。
スレッドが開始されたとき CoInitializeEx 関数を呼び出す。
構文
static HRESULT CoInitializeHelper(void);
戻り値
HRESULT 値を返す。以下はその値である。
S_FALSE CoInitializeEx 関数は有効ではない。 S_OK 成功。 E_FAIL 失敗。
注意
InitialThreadProc メソッドは CoInitializeEx 関数を呼び出すこのヘルパー メソッドを呼び出す。COINIT_DISABLE_OLE1DDE フラグを使い、Dynamic Data Exchange (DDE) を無効にする。詳細については、Platform SDK を参照すること。
次のリクエストを待つ。
構文
DWORD GetRequest(void);
戻り値
派生クラスが定義した値を返す。
注意
このメソッドは他のスレッドが CallWorker メソッドを呼び出すまでブロックする。次に CallWorker に渡したパラメータを返す。 Reply メソッドを呼び出してリクエストしているスレッドを解放する。
CallWorker メソッドで通知済のイベントのハンドルを取得する。
構文
HANDLE GetRequestHandle(void) const;
戻り値
イベント ハンドルを返す。
注意
The CAMEvent クラスは、非公開の手動リセット イベントを維持する。このイベントは CallWorker によって設定され、Reply メソッドによってリセットされる。
WaitForMultipleObjects のような関数を呼び出す場合、GetRequestHandle を使ってイベントハンドルを取得する。
最新のリクエストを取得する。
構文
DWORD GetRequestParam(void) const;
戻り値
最も最近に CallWorker メソッドに送られたパラメータ値を返す。
スレッドが作成されたとき、ThreadProc メソッドを呼び出す。
構文
DWORD InitialThreadProc( LPVOID pv );
パラメータ
- pv
- this ポインタ。
戻り値
CAMThread::ThreadProc が返した DWORD を返す。この値は派生クラスが定義したものである。
注意
The Create メソッドはスレッドを作成する際、このメソッドをスレッド プロシージャに使用する。スレッド引数として this ポインタを使用する。
このメソッドは CoInitializeHelper メソッドを呼び出し、次に ThreadProc を呼び出す。
リクエストに応答する。
構文
void Reply( DWORD dw );
パラメータ
- dw
- CallWorker メソッドの戻り値。
注意
CallWorker メソッドはこのメソッドが呼び出されるまでブロックする。dw パラメータは CallWorker の戻り値を与える。リクエストを取得した後にスレッド プロシージャでこのメソッドを呼び出して、リクエストしているスレッドを解放する。
スレッドがあるかどうか調べる。
構文
BOOL ThreadExists(void);
戻り値
スレッドがある場合 TRUE を返し、スレッドがない場合 FALSE を返す。
スレッド プロシージャ。
構文
virtual DWORD ThreadProc(void) = 0;
戻り値
Returns a DWORD 値を返す、その意味は派生クラスによって定義される。
注意
これは純粋な仮想メソッドである。このメソッドを仮想クラスで実行して、スレッド プロシージャに与える。 Create メソッドがスレッドを作成するとき、順に ThreadProc メソッドを呼び出す InitialThreadProc メソッドのアドレスを与える。
通常 ThreadProc メソッドは(GetRequest や CheckRequest メソッドを呼び出すことで)リクエストを取得するループとなり、データを処理する。
このメソッドが戻るとき、スレッドは終了する。