Microsoft DirectX 8.0

CAMThread クラス

CAMThread クラスの階層

ワーカー スレッドを管理する抽象クラス。

宣言 : 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 を使って、他のスレッドからアクセスされているスレッドをロックする。(たとえば、CreateCallWorker メソッドはこのロックを保持し、スレッドの操作を継続する。) m_WorkerLock を使い、スレッド間で共有されているデータをロックする。

Protected メンバ変数
m_hThreadスレッドのハンドル。
Public メンバ関数
m_AccessLock他のスレッドからアクセスされてるスレッドをロックするクリティカル セクション。
m_WorkerLockスレッド間で共有されているデータをロックするクリティカル セクション。
Public メソッド
CAMThreadコンストラクタ メソッド。
~CAMThreadデストラクタ メソッド。仮想。
InitialThreadProcスレッドが作成されたとき ThreadProc メソッドを呼び出す。
Createスレッドの作成。
CallWorkerスレッドにリクエストを通知する。
Closeスレッドの終了を待ち、そのリソースを解放する。
ThreadExistsスレッドが終了したかどうかを調べる。
GetRequest次のリクエストを待つ。
CheckRequestリクエストがあれば、ブロッキングなしでチェックする。
Replyリクエストに応答する。
GetRequestHandleCallWorker メソッドで通知済のイベントのハンドルを取得する。
GetRequestParam最新のリクエストを取得する。
CoInitializeHelperスレッドの開始時に CoInitializeEx を呼び出す。
純粋な仮想メソッド
ThreadProcスレッド プロシージャ。

CAMThread.m_AccessLock

CAMThread クラス

他のスレッドからアクセスされているスレッドをロックするクリティカル セクション。

構文

CCritSec m_AccessLock;

注意

CreateCallWorker メソッドはこのロックを保持し、スレッドの操作を継続する。

CAMThread.m_WorkerLock

CAMThread クラス

スレッド間で共有されているデータをロックするクリティカル セクション

構文

CCritSec m_WorkerLock;

CAMThread.m_hThread

CAMThread クラス

スレッドのハンドル

構文

HANDLE m_hThread;

注意

この変数は NULL で初期化される。Create メソッドはこの変数をスレッド ハンドルに設定する。スレッドが終了したかどうかを見極めるには、ThreadExists メソッドを呼び出す。

CAMThread::CAMThread

CAMThread クラス

コンストラクタ メソッド。

構文

CAMThread(void);

注意

このコンストラクタ メソッドはスレッドを作成しない。スレッドを作成するには Create を呼び出す。

CAMThread::~CAMThread

CAMThread クラス

デストラクタ メソッド

構文

virtual ~CAMThread(void);

注意

このデストラクタ メソッドは Close メソッドを呼び出す、このメソッドはスレッドの終了を待つ。

CAMThread::CallWorker

CAMThread クラス

スレッドにリクエストを通知する。

構文

DWORD CallWorker(
    DWORD dwParam
);

パラメータ

dwParam
リクエスト パラメータ。この派生クラスはパラメータの意味を定義する。

戻り値

派生クラスが定義した値を返す。

注意

GetRequestCheckRequest メソッドは dwParam パラメータの値を取得する。GetRequest メソッドは CallWorker が呼び出されるまでブロックする。

このメソッドは Reply メソッドが呼び出されるまでブロックする。戻り値は Reply によって与えられたパラメータ。

このメソッドは m_AccessLock ロックをホールドし、リクエストを継続する。したがって、スレッドからあるいはスレッドのコンテクストを実行するメンバ関数からこのメソッドを呼び出す。

CAMThread::CheckRequest

CAMThread クラス

リクエストがあれば、ブロッキングなしでチェックする。

構文

BOOL CheckRequest(
    DWORD *pParam
);

パラメータ

pParam
CallWorker メソッドの最後の呼び出しに通した値を受け取る変数のポインタ。

戻り値

未処理のリクエストがあれば TRUE を、それ以外なら FALSE を返す。

注意

このメソッドは GetRequest の非ブロッキング版である。

他のスレッドが CallWorker の呼び出しを待っているなら、このメソッドはリクエストパラメータを取得し、TRUE を返す。それ以外の場合、FALSE を返す。このメソッドが TRUE を返したら、Reply メソッドを呼び出し、スレッドのリクエストを取得する。

CAMThread::Close

CAMThread クラス

スレッドの終了を待ち、そのリソースを解放する。

構文

void Close(void);

戻り値

戻り値なし。

注意

このメソッドを呼び出す前に、スレッドが終了できるようにしなければならない。たとえば ThreadProc メソッドを使って、スレッドに対して終了を通知するリクエストを定義する。次に CAMThread::CallWorker メソッドをその値で呼び出す。

The ~CAMThread デストラクタ メソッドはこのメソッドを呼び出す。

CAMThread::Create

CAMThread クラス

スレッドの作成。

構文

BOOL Create(void);

戻り値

成功すれば TRUE を返し、それ以外なら FALSE を返す。

注意

このメソッドはスレッドを作成する、その際スレッド プロシ−ジャとして InitialThreadProc メソッドを、スレッド引数として this を使用する。

このメソッドはスレッドが既にある場合失敗する。

CAMThread::CoInitializeHelper

CAMThread クラス

スレッドが開始されたとき CoInitializeEx 関数を呼び出す。

構文

static HRESULT CoInitializeHelper(void);

戻り値

HRESULT 値を返す。以下はその値である。

S_FALSECoInitializeEx 関数は有効ではない。
S_OK成功。
E_FAIL失敗。

注意

InitialThreadProc メソッドは CoInitializeEx 関数を呼び出すこのヘルパー メソッドを呼び出す。COINIT_DISABLE_OLE1DDE フラグを使い、Dynamic Data Exchange (DDE) を無効にする。詳細については、Platform SDK を参照すること。

CAMThread::GetRequest

CAMThread クラス

次のリクエストを待つ。

構文

DWORD GetRequest(void);

戻り値

派生クラスが定義した値を返す。

注意

このメソッドは他のスレッドが CallWorker メソッドを呼び出すまでブロックする。次に CallWorker に渡したパラメータを返す。 Reply メソッドを呼び出してリクエストしているスレッドを解放する。

CAMThread::GetRequestHandle

CAMThread クラス

CallWorker メソッドで通知済のイベントのハンドルを取得する。

構文

HANDLE GetRequestHandle(void) const;

戻り値

イベント ハンドルを返す。

注意

The CAMEvent クラスは、非公開の手動リセット イベントを維持する。このイベントは CallWorker によって設定され、Reply メソッドによってリセットされる。

WaitForMultipleObjects のような関数を呼び出す場合、GetRequestHandle を使ってイベントハンドルを取得する。

CAMThread::GetRequestParam

CAMThread クラス

最新のリクエストを取得する。

構文

DWORD GetRequestParam(void) const;

戻り値

最も最近に CallWorker メソッドに送られたパラメータ値を返す。

CAMThread::InitialThreadProc

CAMThread クラス

スレッドが作成されたとき、ThreadProc メソッドを呼び出す。

構文

DWORD InitialThreadProc(
    LPVOID pv
);

パラメータ

pv
this ポインタ。

戻り値

CAMThread::ThreadProc が返した DWORD を返す。この値は派生クラスが定義したものである。

注意

The Create メソッドはスレッドを作成する際、このメソッドをスレッド プロシージャに使用する。スレッド引数として this ポインタを使用する。

このメソッドは CoInitializeHelper メソッドを呼び出し、次に ThreadProc を呼び出す。

CAMThread::Reply

CAMThread クラス

リクエストに応答する。

構文

void Reply(
    DWORD dw
);

パラメータ

dw
CallWorker メソッドの戻り値。

注意

CallWorker メソッドはこのメソッドが呼び出されるまでブロックする。dw パラメータは CallWorker の戻り値を与える。リクエストを取得した後にスレッド プロシージャでこのメソッドを呼び出して、リクエストしているスレッドを解放する。

CAMThread::ThreadExists

CAMThread クラス

スレッドがあるかどうか調べる。

構文

BOOL ThreadExists(void);

戻り値

スレッドがある場合 TRUE を返し、スレッドがない場合 FALSE を返す。

CAMThread::ThreadProc

CAMThread クラス

スレッド プロシージャ。

構文

virtual DWORD ThreadProc(void) = 0;

戻り値

Returns a DWORD 値を返す、その意味は派生クラスによって定義される。

注意

これは純粋な仮想メソッドである。このメソッドを仮想クラスで実行して、スレッド プロシージャに与える。 Create メソッドがスレッドを作成するとき、順に ThreadProc メソッドを呼び出す InitialThreadProc メソッドのアドレスを与える。

通常 ThreadProc メソッドは(GetRequestCheckRequest メソッドを呼び出すことで)リクエストを取得するループとなり、データを処理する。

このメソッドが戻るとき、スレッドは終了する。