次の方法で共有


CAMThread クラス

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

クラスは CAMThread 、ワーカー スレッドを管理するための抽象クラスです。

保護されたメンバー変数 説明
m_hThread スレッドを処理します。
パブリック メンバー変数 説明
m_AccessLock スレッドが他のスレッドからアクセスされないようにロックするクリティカル セクション。
m_WorkerLock スレッド間で共有されるデータをロックするクリティカル セクション。
パブリック メソッド 説明
CAMThread コンストラクター メソッド。
~ CAMThread デストラクター メソッド。 仮想。
InitialThreadProc スレッドの作成時に ThreadProc メソッドを呼び出します。
作成 スレッドを作成します。
CallWorker 要求を使用してスレッドに通知します。
閉じる スレッドが終了するまで待ってから、そのリソースを解放します。
ThreadExists スレッドが存在するかどうかを照会します。
GetRequest 次の要求を待機します。
CheckRequest ブロックせずに要求があるかどうかを確認します。
返信 要求に応答します。
GetRequestHandle CallWorker メソッドによって通知されるイベントへのハンドルを取得します。
GetRequestParam 最新の要求を取得します。
CoInitializeHelper スレッドの開始時に CoInitializeEx を呼び出します。
純粋仮想メソッド 説明
ThreadProc スレッド プロシージャ。

解説

このクラスは、ワーカー スレッドを作成し、スレッドに要求を渡し、スレッドが終了するのを待機するためのメソッドを提供します。 このクラスを使用するには、次の操作を行います。

  • からクラス CAMThread を派生させ、純粋仮想メソッド CAMThread::ThreadProc をオーバーライドします。 このメソッドは、スレッドの開始時に呼び出されるスレッド プロシージャです。
  • アプリケーションで、派生クラスのインスタンスを作成します。 オブジェクトを作成しても、スレッドは作成されません。 スレッドを作成するには、 CAMThread::Create メソッドを 呼び出します。
  • 要求をスレッドに送信するには、 CAMThread::CallWorker メソッドを 呼び出します。 このメソッドは DWORD パラメーターを受け取ります。このパラメーターの意味はクラスによって定義されます。 メソッドは、スレッドが応答するまでブロックします (以下を参照)。
  • スレッド プロシージャで、 CAMThread::GetRequest または CAMThread::CheckRequest を呼び出して要求 に応答します。 GetRequest メソッドは、別のスレッドが CallWorker を呼び出すまでブロックします。 CheckRequest メソッドは非ブロッキングです。これにより、スレッドは非同期的に動作しながら新しい要求をチェックできます。
  • スレッドが要求を受信したら、 CAMThread::Reply を呼び出して、呼び出し元のスレッドのブロックを解除します。 Reply メソッドは、呼び出し元のスレッドに CallWorker の戻り値として渡される DWORD パラメーターを受け取ります。

スレッドが完了したら、 CAMThread::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); // Thread exits.
}

派生クラスでは、パラメーターを 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 つの重要なセクションを提供します。 スレッドが他のスレッドからアクセスされないようにロックするには、 を使用 CAMThread::m_AccessLock します。 (たとえば、Create メソッドと CallWorker メソッドは、スレッドに対する操作をシリアル化するために、このロックを保持します)。 CAMThread::m_WorkerLock を使用して、スレッド間で共有されているデータをロックします。

要件

要件
ヘッダー
Wxutil.h (Streams.h を含む)
ライブラリ
Strmbase.lib (製品版ビルド);
Strmbasd.lib (デバッグ ビルド)