нерешенные проблемы с C EDITTEXT и DIRECTSHOW PAUSE()

#c #directshow #atl #graphedit

#c #directshow #atl #graphedit

Вопрос:

у меня есть простая winform, которая записывает в EDITTEXT, поскольку программа продолжает процесс печати, выполняющийся идеально. но как только я нажимаю кнопку STOP, которая сначала вызывает функцию PAUSE (), моя программа застревает внутри

 SetWindowText(m_hWatermarksEditBox, amp;m_watermarkLog[0]);
  

все значения инициализированы, и вводятся надлежащие данные.

я предполагаю, что я должен объявить РАБОЧИЙ МЕТОД, как в C#.NET но я не знаю как.

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

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

Ответ №1:

Вы не показываете, что вы делаете SetWindowText но поскольку у вас есть пользовательский фильтр, наиболее вероятная проблема заключается в том, что с помощью этого вызова вы блокируете выполнение потокового потока / рабочего потока, а задействованные потоки блокируются мертвым.

SetWindowText безопасно вызывать только из вашего потока пользовательского интерфейса (ну, технически не только из него, но определенно не из потока потоковой передачи). Поэтому, если вы хотите обновить управляющий текст или отправить ему какое-либо сообщение, вы должны сделать это по-другому, чтобы ваш вызывающий поток мог продолжать работать.

Обычно вы сохраняете некоторую релевантную информацию в переменной-члене (не забывайте о блокировке критического раздела), затем PostMessage получаете сообщение в своем окне / элементе управления и обрабатываете его там в нужном потоке, вызывая SetWindowText там.

Смотрите Управление частотой кадров и временем экспозиции с помощью sampleCB. Это немного другая тема, но полезная с точки зрения отправки / размещения сообщений в фильтре DirectShow.