2011-11-09 53 views
0

我有一個簡單的winform寫入EDITTEXT,因爲程序在打印過程中執行完美。但一旦我點擊停止按鈕,首先調用PAUSE() 運作我的程序卡住C++ EDITTEXT和DIRECTSHOW 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; 
     } 

回答

0

你不顯示你在哪裏做SetWindowText但你有自定義過濾器最有可能的問題是,這個叫你阻止你流/工作線程執行和參與線程鎖死。

SetWindowText只能從您的UI線程中調用(從技術上說,不僅僅是它,而且絕對不是流式線程)。所以如果你想更新控制文本或發送任何消息給它,你必須以不同的方式來完成,這樣你的調用者線程才能繼續運行。

通常情況下,您會在成員變量中存儲一些相關信息(請勿忘記臨界區段鎖),然後PostMessage,在窗口/控件上接收消息並在右側處理它,並在那裏調用SetWindowText

請參閱controlling frame/rate and exposure time through sampleCB。它涵蓋了一些不同的主題,但在DirectShow過濾器中發送/發佈消息方面很有用。