次の方法で共有


停止

Stop メソッドは Receive メソッドの動作を停止し、フィルタのアロケータをデコミットする必要がある。アロケータをデコミットすると、ペンディング状態の GetBuffer 呼び出しはすべて返り、サンプルを待っているアップストリーム フィルタの動作の停止が解除される。Stop メソッドはフィルタ ロックを保持した後、CBaseFilter::Stop メソッドを呼び出す。その結果、フィルタのすべてのピンの CBasePin::Inactive が呼び出される。

HRESULT CMyFilter::Stop()
{
    CAutoLock lock_it(m_pLock);
    // フィルタ リソースを保護するため、すべてのピンを非アクティブにする。
    hr = CBaseFilter::Stop();

    /* ストリーミング スレッドで使われるフィルタ リソースを破棄しても安全である。 */

    return hr;
}

 入力ピンの Inactive メソッドを次のようにオーバーライドする。

HRESULT CMyInputPin::Inactive()
{
    // ここではフィルタ ロックを保持する必要はない。
    // 既に Stop で保持されている。

    // Receive の動作停止を解除する。
    SetEvent(m_hSomeEventThatReceiveNeedsToWaitOn);

    // Receive を確実に失敗させる。
    // また、アロケータもデコミットする。
    HRESULT hr = CBaseInputPin::Inactive();

    // Receive が完了し、リソースを使っていないことを確認する。
    {
       CAutoLock c(&m_csReceive);

       /* ストリーミング スレッドで使われるフィルタ リソースを破棄しても安全である。 */
    }

    return hr;
}