0

我正在使用一个我不熟悉的相当大且复杂的代码库,它使用DirectWrite进行文本渲染。我不知道这是否重要,但这是一个 WinRT(Windows 应用商店)应用程序。

该应用程序是多线程的,并且一些 DirectX 调用是从后台(不是 UI)线程完成的。所有的BeginDrawEndDraw调用都是从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。)

4

3 回答 3

3

SEH异常只是Win32异常:Windows内部使用的异常机制,与C++异常不同。

因此,所有 SEH 异常都告诉您“某些 Windows 函数引发了异常”。与任何其他例外一样,发生这种情况的原因有很多。

因此,询问这种例外的“通常原因”是什么是徒劳的。

a 的常见原因是std::exception什么?他们有很多。

于 2012-10-05T09:40:34.687 回答
0

该问题仅出现在单台计算机上,无法在其他计算机上重现。并且在更新视频卡驱动程序后,它也在该计算机上停止,因此可能是一些驱动程序问题(Windows 8 的 Nvidia 驱动程序已经存在一些问题)。

于 2012-10-10T07:26:56.933 回答
0

确保打开 DirectX 调试运行时。在视觉工作室中运行。它具有打印到控制台的非常详细的错误检查。要打开它,请运行 DirectX 控制面板。

于 2012-10-10T08:26:16.297 回答