【问题标题】:gdi functions are crashedgdi 函数崩溃
【发布时间】:2012-12-04 16:49:11
【问题描述】:

我从 gdi 函数中得到奇怪的访问冲突。我的应用程序就像一个图形引擎,多个线程会请求绘制不同的图形对象。单个线程会将所有图形对象绘制到内存 DC。这些线程之间的同步是正确的。

当我准备 userdump 时,两个线程发生了访问冲突。下面是两个线程的调用栈,GetTextExtentPoint32和CreateFontIndirect都crash了。

// 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 ) 来获取访问冲突,但它没有崩溃.. 请帮我找原因..

【问题讨论】:

  • The synchronization between these threads are correct. ... 你确定吗?

标签: windows gdi


【解决方案1】:

您有两个不同的线程同时处理 GDI 调用。如果这些调用涉及相同的设备上下文或 GDI 对象,那么您的线程同步中存在错误。

【讨论】:

    【解决方案2】:
    猜你喜欢
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多