c++ EDITTEXT和DIRECTSHOW PAUSE()中未解决的问题

unresolved problems with C++ EDITTEXT and DIRECTSHOW PAUSE()

本文关键字:未解决 问题 EDITTEXT DIRECTSHOW PAUSE c++      更新时间:2023-10-16

我有一个简单的winform,它写入一个EDITTEXT,随着程序的继续,打印过程执行完美。但是一旦我点击停止按钮,首先调用PAUSE()函数我的程序卡在

里面
SetWindowText(m_hWatermarksEditBox, &m_watermarkLog[0]);

所有值初始化,正确的数据进入。

我猜我必须声明一个METHOD WORKER,就像在c#中一样。. NET,但我不知道如何。

STDMETHODIMP CNaveFilter::Pause()
        {
            ATLTRACE(L"(%0.5d)CNaveFilter::Pause() (this:0x%.8x)rn", GetCurrentThreadId(), (DWORD)this);
            HRESULT hr = S_OK;
            CAutoLock __lock(&m_cs);
            hr = CBaseFilter::Pause();
            return hr;
        }
        STDMETHODIMP CNaveFilter::Stop()
        {
            ATLTRACE(L"(%0.5d)CNaveFilter::Stop() (this:0x%.8x)rn", GetCurrentThreadId(), (DWORD)this);
            HRESULT hr = S_OK;
            CAutoLock __lock(&m_cs);
            hr = CBaseFilter::Stop();
            ATLASSERT(SUCCEEDED(hr));
            return hr;
        }

你没有显示你在哪里做SetWindowText,但当你有自定义过滤器时,最有可能的问题是,这个调用你阻塞了你的流/工作线程执行,所涉及的线程锁定死亡。

SetWindowText只能安全地从UI线程调用(好吧,技术上不仅是它,但绝对不是流线程)。所以,如果你想更新控件文本或向它发送任何消息,你必须用不同的方式来做,这样你的调用线程才能继续运行。

通常,你会在成员变量中存储一些相关的信息(不要忘记临界区锁),然后PostMessage,在你的窗口/控件上接收消息,并在正确的线程中处理它,在那里调用SetWindowText

参见通过sampleCB控制帧/速率和曝光时间。它涵盖了一个有点不同的主题,但在DirectShow过滤器中发送/发布消息方面很有用。