0

テキスト レンダリングにDirectWriteを使用する、かなり大規模で複雑なコードベースを扱っています。関係あるかどうかはわかりませんが、これは WinRT (Windows ストア) アプリケーションです。

アプリはマルチスレッドであり、一部の DirectX 呼び出しはバックグラウンド (UI ではない) スレッドから実行されます。すべてのBeginDrawおよびEndDraw呼び出しはUI スレッドから行われ、一部のDrawText呼び出しはバックグラウンドスレッドから行われます。これらの呼び出しが重複しないようにし、DrawText は BeginDraw と EndDraw のペアの間でのみ呼び出されるようにしました。

ただし、DrawText メソッドを呼び出すと、 SEHExceptionが発生することがあります。UI スレッドから呼び出された場合は発生せず、バックグラウンドスレッドから呼び出された場合のみ発生します。
これは、すべてのコンピューターで発生するわけではありません。一部のデバイスでは頻繁に発生し、他のデバイスではまったく再現できません。
VS Debugger が言う正確なメッセージは次のとおりです DrawText 呼び出しで d2d1.h ヘッダー ファイルが壊れます。

SEHException がスローされたときに問題をデバッグまたは診断する方法はありますか? (これは、バックグラウンド スレッドから DrawText 関数を呼び出すことに明らかに関連しています。)
また、バックグラウンド スレッドから DirectX 関数を呼び出す一般的な規則はありますか? (D2D1Factory が D2D1_FACTORY_TYPE_MULTI_THREADED オプションで作成されることを確認しました。)

4

3 に答える 3

3

SEH 例外は単なる Win32 例外です。Windows が内部的に使用する例外メカニズムであり、C++ 例外とは異なります。

そのため、SEH 例外からわかるのは、「一部の Windows 関数が例外をスローした」ということだけです。他の例外と同様に、これは多くの理由で発生する可能性があります。

したがって、そのような例外の「通常の理由」が何であるかを尋ねることは、無駄なことです。

の通常の理由は何std::exceptionですか? それらはたくさんあります。

于 2012-10-05T09:40:34.687 に答える
0

DirectX デバッグ ランタイムを必ずオンにしてください。ビジュアル スタジオで実行します。コンソールに出力される非常に詳細なエラー チェックがあります。オンにするには、DirectX コントロール パネルを実行します。

于 2012-10-10T08:26:16.297 に答える
0

問題は 1 台のコンピューターでのみ発生し、他のコンピューターでは再現できませんでした。また、ビデオ カード ドライバーの更新後、そのコンピューターでも停止したため、何らかのドライバーの問題である可能性があります (Windows 8 の Nvidia ドライバーには既にいくつかの問題が発生しています)。

于 2012-10-10T07:26:56.933 に答える