2011-11-09 16 views
0

私はEDITTEXTに書き込む簡単なwinformを持っています。私が最初にPAUSE() が私のプログラムは、すべての値が初期化され、適切なデータがで取得未解決の問題C++ EDITTEXTとDIRECTSHOW PAUSE()

SetWindowText(m_hWatermarksEditBox, &m_watermarkLog[0]); 

の内側に立ち往生関数を呼び出すSTOP]ボタンをクリックすると。しかし

私の推測では、私がしなければならないということです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フィルタでメッセージを送信/投稿するのに役立ちます。