1

私は現在、マイクからオーディオ信号をキャプチャし、別のスレッドでフーリエ変換 (オーディオの周波数を取得するため) を計算し、最終的に結果を画面にプロットするプログラム (C++ Win32、Visual Studio 2012) を開発しています。 .

プロット以外はすべて正常に動作するため、これは GUI 関連のトピックです。

WndProc では、バッファーがいっぱいで処理の準備ができたときにメッセージを受け取り、呼び出します。

boost::thread t(&ComputationThread,data);

計算スレッドを開始します。

最後にComputationThread、定義済みの固定値とデータ ポインターを引数として使用して、データをプロットするために GUI スレッドにメッセージを送信します。

SendMessage(hWnd, WM_PAINT, PARAM_FFT_COMPUTED, (LPARAM)data);

これも問題なく動作し、メッセージが表示され、計算されたデータをファイルに書き込むこともできますが、フォーム上での描画 (例: を使用SetPixel) は効果がwParamありません PARAM_FFT_COMPUTEDが、そうでない場合、たとえばフォームがサイズ変更されます。

InvalidateRectも効果がありません。

私は何を間違っていますか?

前もって感謝します!

4

1 に答える 1

14

を送信するためのものではありませんWM_PAINT。特別に合成されたメッセージです。投稿したり送信したりすることはありません。代わりに、または関連する関数の1つを呼び出しInvalidateRectて、システムにを生成させWM_PAINTます。

WM_PAINTまた、メッセージハンドラの外側のウィンドウに描画することを意図したものではありません。または、GUIスレッド以外のスレッドから。おそらくあなたはそれらのことを何もしていませんが、それらはよくある間違いなので、それについて言及するのは害はありません。

InvalidateRect動作しない場合は、コードに根本的な問題があります。他のメカニズムでペイントを機能させるのではなく、それを修正する必要があります。

したがって、解決策は、ハンドラーInvalidateRectで壊れているものをすべて使用して修正することです。WM_PAINTあなたのWM_PAINTハンドラーを見ずに、私は何が悪いのかについて推測したくありません。

于 2012-10-09T15:09:54.483 に答える