2012-12-17 2 views
0

Im에 gdi 함수에서 이상한 액세스 위반이 발생했습니다. 내 응용 프로그램은 그래픽 엔진과 같아서 여러 스레드가 다른 그래픽 객체의 그리기를 요청합니다. 단일 스레드는 모든 그래픽 객체를 메모리 DC에 그립니다. 이 스레드 간의 동기화가 올바르다.gdi 함수가 충돌했습니다.

userdump를 준비했을 때 두 스레드에서 액세스 위반이 발생했습니다. 다음은 두 스레드의 호출 스택입니다. GetTextExtentPoint32와 CreateFontIndirect는 충돌합니다.

// 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 충돌의 가능한 원인은 무엇입니까? 애플리케이션에서 두 가지 액세스 위반이 발생하지 않았습니다. 어떻게됩니까? 이 응용 프로그램은 거의 안정적이며 이러한 지점에서 액세스 위반이 발생하지 않습니다. CreateFontIndirect (NULL)을 호출하여 액세스 위반을 시도했지만 충돌이 발생하지 않았습니다. 이유를 찾으려면 ...

+3

'스레드 간의 동기화가 정확합니다 .' ... ** ** 확실합니까? – SLaks

답변

1

GDI 호출을 처리하는 스레드가 두 가지 있습니다. 이러한 호출에 동일한 장치 컨텍스트 또는 GDI 개체가 관련된 경우 스레드 동기화에 버그가 있습니다.

관련 문제