нерешенные проблемы с C ++ EDITTEXT и DIRECTSHOW PAUSE () - PullRequest
0 голосов
/ 09 ноября 2011

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

SetWindowText(m_hWatermarksEditBox, &m_watermarkLog[0]);

все значения инициализированы, и в них поступают правильные данные.

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

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 Ответ

0 голосов
/ 09 ноября 2011

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

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

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

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

...