【发布时间】:2012-10-04 18:09:35
【问题描述】:
我正在处理一个我不熟悉的相当大且复杂的代码库,它使用 DirectWrite 进行文本渲染。我不知道这是否重要,但这是一个 WinRT(Windows 应用商店)应用程序。
该应用是多线程,一些 DirectX 调用是从后台(不是 UI)线程完成的。所有 BeginDraw 和 EndDraw 调用都是从 UI 线程 进行的,并且一些 DrawText 调用是从背景线程。我确保这些调用都没有重叠,并且 DrawText 仅在 BeginDraw 和 EndDraw 对之间调用。
但是,有时我在调用 DrawText 方法时会收到 SEHException。当从 UI 线程 调用它时,它永远不会发生,只有在从 后台 线程调用时才会发生。
这不会发生在每台计算机上。它经常发生在某些人身上,并且根本无法在其他人身上重现。
VS 调试器说的确切消息是这样的:“x.DLL 中发生了 'System.Runtime.InteropServices.SEHException' 类型的第一次机会异常”,它发生在我调用 ID2D1DeviceContext.DrawText() 函数,调试器会在 DrawText 调用时中断 d2d1.h 头文件。
当抛出 SEHException 时,有什么方法可以调试或诊断出了什么问题? (这显然与从后台线程调用 DrawText 函数有关。)
除此之外,是否有任何从后台线程调用 DirectX 函数的一般规则? (我确保使用 D2D1_FACTORY_TYPE_MULTI_THREADED 选项创建 D2D1Factory。)
【问题讨论】:
-
听起来像是竞争条件。
-
抛出结构化异常时程序在做什么? (即,堆栈上有什么?正在执行什么函数?是你的代码还是平台代码?)抛出了什么异常? (所有本机异常都使用结构化异常处理进行处理,因此“在某处抛出了 SEH 异常”并不是特别有用。)
-
我用确切的异常消息和抛出它的位置澄清了这个问题。
标签: c++ windows-8 directx windows-runtime directwrite