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

158 views Asked by At

i have a simple winform that writes to an EDITTEXT , as the program goes on the printing process executing perfectly . but once i click the STOP BUTTON which firstly calls the PAUSE() function my program gets stuck inside the

SetWindowText(m_hWatermarksEditBox, &m_watermarkLog[0]);

all values are initialized and proper data gets in.

my guess is that i have to declare a METHOD WORKER , like in C#.NET but i dont know how.

STDMETHODIMP CNaveFilter::Pause()
        {
            ATLTRACE(L"(%0.5d)CNaveFilter::Pause() (this:0x%.8x)\r\n", 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)\r\n", GetCurrentThreadId(), (DWORD)this);
            HRESULT hr = S_OK;
            CAutoLock __lock(&m_cs);

            hr = CBaseFilter::Stop();
            ATLASSERT(SUCCEEDED(hr));
            return hr;
        }
1

There are 1 answers

0
Roman Ryltsov On

You don't show where you are doing SetWindowText but as you have the custom filter the most likely problem is that with this call you block your streaming/worker thread execution and the involved threads lock dead.

SetWindowText is only safe to be called from your UI thread (well, technically not only it, but definitely not a streaming thread). So if you want to update the control text or send any message to it, you have to do it in a different way, so that your caller thread could keep running.

Typically, you would store some relevant information in member variable (don't forget critical section lock) then PostMessage, receive the message on your window/control and handle it there in the right thread, calling SetWindowText there.

See controlling frame/rate and exposure time through sampleCB. It covers a bit different topic, but useful in terms of sending/posting messages in a DirectShow filter.