我从gdi函数中获得了奇怪的访问冲突。我的应用程序就像一个图形引擎,多个线程将请求绘制不同的图形对象。单个线程将所有图形对象绘制到内存DC。这些线程之间的同步是正确的。
当我准备userdump时,从两个线程发生访问冲突。以下是两个线程的callstack,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)来获取访问冲突,但它没有崩溃.. 请帮我找个理由..
答案 0 :(得分:1)
你有两个不同的线程同时处理GDI调用。如果这些调用涉及相同的设备上下文或GDI对象,则您的线程同步中存在错误。
答案 1 :(得分:1)