解决方案 »

  1.   

    DEBUG调试时可以暂停进程,看看函数调用堆栈在哪个模块没退出来。
    STOP里的话,基本上是线程没退出来。
      

  2.   

    围观中……LZ太强悍了,但是问题描述的有点简单
    如果有必要,可以贴下IBaseFilter上的那几个控制函数的实现
      

  3.   

    这是sourcefilter的几个方法实现,各位大侠帮忙看看:
    CInputDataFilter::CInputDataFilter(LPUNKNOWN lpunk, HRESULT *phr) :
    CSource(NAME("InputData Filter"), lpunk, CLSID_InputData_Filter)
    {
        ASSERT(phr);
        CAutoLock cAutoLock(&m_cStateLock);

        m_paStreams = (CSourceStream **)new CDataOutputPin*[1];
        if(m_paStreams == NULL)
        {
            if(phr)
                *phr = E_OUTOFMEMORY;

            return;
        }

        m_paStreams[0] = new CDataOutputPin(phr, this, L"Output");
        if(m_paStreams[0] == NULL)
        {
            if(phr)
                *phr = E_OUTOFMEMORY;

            return;
        } m_mediaType.InitMediaType();
    }CInputDataFilter::~CInputDataFilter()
    {
    m_listBuffer.clear();
    }CUnknown * WINAPI CInputDataFilter::CreateInstance(LPUNKNOWN lpunk, HRESULT *phr)
    {
        ASSERT(phr);
    CAutoLock cAutoLock(&m_cStateLock);    CUnknown *punk = new CInputDataFilter(lpunk, phr);
        if(punk == NULL)
        {
            if(phr)
                *phr = E_OUTOFMEMORY;
        }
        return punk;
    }STDMETHODIMP CInputDataFilter::NonDelegatingQueryInterface(REFIID riid, void ** ppv)
    {
    CAutoLock cAutoLock(&m_cStateLock); CheckPointer(ppv, E_POINTER); if (riid == IID_IInputData)
    {
    return GetInterface((IInputData*) this, ppv);
    }
    else 
    {
    return CSource::NonDelegatingQueryInterface(riid, ppv);
    }
    }STDMETHODIMP CInputDataFilter::SetMediaType(AM_MEDIA_TYPE *pMediaType)

    CAutoLock cAutoLock(pStateLock());
       
    CheckPointer(pMediaType, E_POINTER);
       
    CMediaType mediaType(*pMediaType);
    m_mediaType = *pMediaType; return NOERROR;
    }STDMETHODIMP CInputDataFilter::PushData(BYTE *inBuffer, int length)
    {
    CAutoLock cAutoLock(pStateLock());
    string cBuffer;
    cBuffer.assign((char*)inBuffer, length);
    m_listBuffer.push_back(cBuffer);
    return NOERROR;
    }
      

  4.   

    楼主,你这个问题解决没有呢?我现在做directshow释放的时候调用stop,也会卡死在这一句,实在是不明白到底是哪里出了问题,如果楼主解决了,还请指教,谢谢了。