0

データをフラッシュするためのフィルター スレッドに関する考慮事項に関するMSDN ページでは、単一の入力ピンと 1 つ以上の出力ピンを持つフィルターのBeginFlushEndFlushの推奨される実装を示します。

複数の入力ピンを持つフィルタの場合、これをどのように安全に拡張する必要がありますか? DeliverBeginFlush と DeliverEndFlush はすべての入力ピンに対して呼び出す必要がありますか?それとも、BeginFlush/EndFlush を受け取る最初または最後の入力ピンに対して呼び出す必要がありますか? 入力ピン間の操作の正確な順序は重要ですか? 1 つの入力ピンが BeginFlush と EndFlush の両方を終了し、他のピンが BeginFlush や EndFlush を受信する前に新しいサンプルを受信することは許されますか? この状況で他に考慮すべき点や落とし穴はありますか?

現時点では、複数の入力ピンを持つフィルターが、EndFlush の完了後にアップストリームから古いキューのサンプルを受信することがあり、バグがフィルターにあるのか、それともさらにアップストリームにあるのかを診断しようとしています。入力ピンは、出力サンプルを生成する別のスレッドのサンプルをキューに入れているため、m_hSomeEventThatReceiveNeedsToWaitOn 手法を利用して、出力処理を行うスレッドのブロックを解除します。

HRESULT CMyInputPin::BeginFlush()
{
    CAutoLock lock_it(m_pLock);

    // First, make sure the Receive method will fail from now on.
    HRESULT hr = CBaseInputPin::BeginFlush();

    // Force downstream filters to release samples. If our Receive method
    // is blocked in GetBuffer or Deliver, this will unblock it.
    for (each output pin)
    {
    hr = pOutputPin->DeliverBeginFlush();
    }

    // Unblock our Receive method if it is waiting on an event.
    SetEvent(m_hSomeEventThatReceiveNeedsToWaitOn);

    // At this point, the Receive method can't be blocked. Make sure 
    // it finishes, by taking the streaming lock. (Not necessary if this 
    // is the last step.)
    { 
    CAutoLock lock_2(&m_csReceive);

    /* Now it's safe to do anything that would crash or hang 
       if Receive were executing. */
    }
    return hr;
}

HRESULT CMyInputPin::EndFlush()
{
    CAutoLock lock_it(m_pLock);
    for (each output pin)
        hr = pOutputPin->DeliverEndFlush();
    return CBaseInputPin::EndFlush();
}   
4

1 に答える 1

1

私のコードでは、受け取ったすべてのフラッシュに対してダウンストリームにフラッシュを配信するだけです。問題なく動作しているようです。

HRESULT JoinFilterInputPin::BeginFlush()
{
    JoinFilter* filter = (JoinFilter*)m_pFilter;
    CAutoLock lock(m_pLock);
    CBaseInputPin::BeginFlush();
    filter->output->DeliverBeginFlush();
    return S_OK;
}

HRESULT JoinFilterInputPin::EndFlush()
{
    JoinFilter* filter = (JoinFilter*)m_pFilter;
    CAutoLock lock(m_pLock);
    filter->output->DeliverEndFlush();
    return CBaseInputPin::EndFlush();
}
于 2013-02-05T18:58:01.620 に答える