0

gdi 関数から奇妙なアクセス違反が発生しています。私のアプリケーションはグラフィック エンジンのようなもので、複数のスレッドが異なるグラフィック オブジェクトの描画を要求します。1 つのスレッドがすべてのグラフィック オブジェクトをメモリ DC に描画します。これらのスレッド間の同期は正しいです。

userdump を用意したところ、2 つのスレッドからアクセス違反が発生しました。以下は、GetTextExtentPoint32 と CreateFontIndirect の 2 つのスレッドのコールスタックです。

// Access violation from Draw Request thread.
ntdll!KiUserExceptionDispatcher+0xe
ntdll!RtlRaiseStatus+0x26
ntdll!RtlpUnWaitCriticalSection+0x3b
ntdll!RtlLeaveCriticalSection+0x1d
gdi32!GdiRealizationInfo+0x88
lpk!FontHasWesternScript+0x1e
lpk!LpkUseGDIWidthCache+0x89
gdi32!GetTextExtentPointWInternal+0x100
gdi32!GetTextExtentPoint32W+0x18

// Access violation from Drawing thread.
ntdll!KiUserExceptionDispatcher+0xe
ntdll!RtlRaiseStatus+0x26
ntdll!RtlpWaitForCriticalSection+0x204
ntdll!RtlEnterCriticalSection+0x46
gdi32!CreateFontIndirectExW+0x26
gdi32!CreateFontIndirectW+0x61 

GetTextExtentPoint32 と CreateFontIndirect がクラッシュする原因として考えられるものは何ですか? アプリケーションでアクセス違反が 2 回発生したことはありません。それはどのように起こりますか?このアプリケーションはほぼ安定しており、これらの点からアクセス違反が発生したことはありません。アクセス違反を取得するために CreateFontIndirect( NULL ) を呼び出そうとしましたが、クラッシュしていません.理由を見つけるのを手伝ってください..

4

2 に答える 2

1

GDI 呼び出しを同時に処理する 2 つの異なるスレッドがあります。これらの呼び出しに同じデバイス コンテキストまたは GDI オブジェクトが含まれている場合は、スレッド同期にバグがあります。

于 2012-12-17T17:50:40.533 に答える
1

誤ってハンドルを 2 回閉じたか、クリティカル セクションを破損した可能性があります。

于 2012-12-17T20:04:53.327 に答える