2009-04-07 6 views
0

アンマネージドコードの上に(ほとんど)Winforms UIであるアプリケーションをデバッグしています。 UIコードのほんの一部は、WinFormsではありません。DirectXを使用して、一部のPanelコンポーネントの表面に直接描画しています。これを行うために、コンポーネントのウィンドウハンドルが作成された後に記録され、このDirectXディスプレイを実行するモジュールが必要とするハンドル(例えばGetWindowRect())を必要とする後続の呼び出しでこのハンドルが使用されます。このメカニズムは、私が説明しようとしている問題を見ずにしばらくの間存在していましたが、多分私たちはただ運が良かったのかもしれません。これを配置したプログラマはもう私には利用できません。bgndスレッドからDirectX呼び出しを安全にするためにWindowsハンドルを使用していますか?

私が解決しようとしている問題は、間欠的に、このエリアの表示が壊れてしまうことです。このルーチンはバックグラウンドスレッドから呼び出されています。私はアプリケーションログで、例えば、GetWindowRect()の呼び出しが突然、図面の問題と同時にガベージ座標を返すことがわかりました。ウィンドウハンドル自体は破損していないので、私はWindowsのデータ構造を上書きしていないことを合理的に確信しています。私は表示ストリームを停止して再起動することができ、GetWindowsRect()は、同じWindowsハンドルを使用して、良好な座標を再び返し始めます。

これが.NETレベルであった場合は、Invokeを使用して描画をメインスレッドに延期します。私の質問は、このDirectXコールでも同じことをしなければなりませんか?私はバックグラウンドスレッドで描画しないことに関するMicrosoftの忠告を見つけようとしていました。誰も私にこれを指摘できますか?

PC

答えて

0

Window handles have thread affinityです。

最も重要なユーザーインターフェイス 要素はもちろんウィンドウです。 ウィンドウオブジェクトにはスレッド親和性があります。 ウィンドウを作成するスレッドは、 です。非公式には、 はスレッドが ウィンドウを「所有」していると言っています。メッセージは、所有するスレッド の ウィンドウプロシージャにのみディスパッチされます。 ウィンドウの変更は、 が、 を所有するスレッドからのみ作成される必要があります。ウィンドウマネージャ は、ウィンドウのプロパティ、スタイル、 と、このような ウィンドウプロシージャなどの他の属性など ものにアクセスするための任意のスレッドを許可し、そのようには にアクセスしますが、スレッドビューの窓 マネージャの視点から安全である ロード・修正書き込みシーケンスは通常 が所有者 スレッドに制限されるべきです。

関連する問題