-1

我正在使用从directshow 基类派生的简单directshow 过滤器,CBaseRenderer并且我在这个类中遇到了死锁。

我有一个很好的谷歌,发现有人遇到了完全相同的问题InterfaceLock(在in Stop 和RendererLockin之间出现僵局Receive)但他没有得到任何回应,这表明他和我有一个罕见的情况进入我们的代码(而不是 MS 基类中的错误)。

那么,有没有其他人看到这个问题?我应该从班级派生我的过滤器(它不会做那么多 TBH)CBaseRenderer还是直接去CBaseFilter/CBaseInputPin上课?如果我应该覆盖WaitForReceiveToComplete,我应该在那里放什么?

我将回到基础并查看转储示例过滤器,但我仍然对有使用CBaseRenderer.

4

1 回答 1

2

我想问题可能出在 BaseClasses\renbase.cpp 中的这个循环周围:

void CBaseRenderer::WaitForReceiveToComplete()
{
    // NOTE: m_InterfaceLock is locked higher on the call stack

    for (;;) {
        if (!m_bInReceive) {
            break;
        }

        MSG msg;
        //  Receive all interthread snedmessages
        PeekMessage(&msg, NULL, WM_NULL, WM_NULL, PM_NOREMOVE);

        // TODO: Unlock m_InterfaceLock until the end of the loop 

        Sleep(1);
    }

上面的评论解释了这个问题 - 一个无限循环可能正在尝试进入一个并发线程m_InterfaceLock

如果是这种情况,在那里解锁睡眠可能会有突破的机会。

于 2013-06-20T12:54:49.390 回答