アンマネージドコードの上に(ほとんど)Winforms UIであるアプリケーションをデバッグしています。 UIコードのほんの一部は、WinFormsではありません。DirectXを使用して、一部のPanelコンポーネントの表面に直接描画しています。これを行うために、コンポーネントのウィンドウハンドルが作成された後に記録され、このDirectXディスプレイを実行するモジュールが必要とするハンドル(例えばGetWindowRect())を必要とする後続の呼び出しでこのハンドルが使用されます。このメカニズムは、私が説明しようとしている問題を見ずにしばらくの間存在していましたが、多分私たちはただ運が良かったのかもしれません。これを配置したプログラマはもう私には利用できません。bgndスレッドからDirectX呼び出しを安全にするためにWindowsハンドルを使用していますか?
私が解決しようとしている問題は、間欠的に、このエリアの表示が壊れてしまうことです。このルーチンはバックグラウンドスレッドから呼び出されています。私はアプリケーションログで、例えば、GetWindowRect()の呼び出しが突然、図面の問題と同時にガベージ座標を返すことがわかりました。ウィンドウハンドル自体は破損していないので、私はWindowsのデータ構造を上書きしていないことを合理的に確信しています。私は表示ストリームを停止して再起動することができ、GetWindowsRect()は、同じWindowsハンドルを使用して、良好な座標を再び返し始めます。
これが.NETレベルであった場合は、Invokeを使用して描画をメインスレッドに延期します。私の質問は、このDirectXコールでも同じことをしなければなりませんか?私はバックグラウンドスレッドで描画しないことに関するMicrosoftの忠告を見つけようとしていました。誰も私にこれを指摘できますか?
PC