多量のマルチスレッドのアプリケーションで多数のクラッシュが発生しています。これらMSDN page、technical noteとthis article on TLS読書CWnd :: GetSafeHwnd()とCWnd :: m_hWnd ThreadSafeはありますか?
は、IはCWndのオブジェクトがスレッドdependendentメモリアクセスであるTLSにHWNDにマッピングされることを理解しています。
私はCWndスレッドのリモートアクセスのように見えるものすべてを切り離し、HWND参照に変換してから、通信ポートとしてPostMessageを使用します。 (そして、今のところ現行のコードで見る限り、膨大な量の作業を表しています。私は解決策を完成させていましたが、時間がかかるので、議論しなければなりませんでした)。
私の同僚の一人は、外国人のスレッドにCWnd *を保持し、PostMessageポリシーをそのまま使用することを強く主張しましたが、外部スレッドのCWnd :: GetSafeHwnd()またはpMyCWnd-> m_hWndを使用します。ネイティブのHWNDを復旧します。
私はGetSafeHwndは()、 スレッドセーフであるとのCWndがオブジェTLSにいること、それは別のスレッドの値が異なっているということ見てきたどこと主張してきました。 私は間違っていますか? MSDNでは、「予期しない結果」という用語を使用しています。
作成者のスレッドから外部スレッドでCWnd :: GetSafehwnd()またはpMyCWnd-> m_hWndを呼び出すことはできません。
これは安全であるかどうかを示すMSDNのドキュメントをお持ちですか?
いい加減なアドバイスがありますが、多くのLOCをコード化することができず、10年以上経っていますが、私はそれを拭くことができない巨大な歴史があります:-) –
あなたの質問は基本的に "私はこの非常に危険なことをしなければならない、それは安全ですか?そして答えはおそらく "何もそれを安全にするものではない"ということでしょう。あなたはそれをもっと安全にすることはできますが、現在の設計ではクラッシュフリーにすることはできません。 – StilesCrisis
(私は関係することができます。私は10歳のMFCコードベースで作業しています。スレッドはありません。元のコーダーはそれほどスマートではありませんでした) – StilesCrisis