多线程DirectX代码中SEHException的原因是什么?

时间:2012-10-04 18:09:35

标签: c++ windows-8 directx windows-runtime directwrite

我正在处理一个我不熟悉的相当大而复杂的代码库,它使用 DirectWrite 进行文本呈现。我不知道是否重要,但这是一个WinRT(Windows Store)应用程序。

该应用多线程,一些DirectX调用是从后台(非UI)线程完成的。所有 BeginDraw EndDraw 调用均来自 UI线程,而某些 DrawText 调用来自后台主题。我确保这些调用都不重叠,并且只在BeginDraw和EndDraw对之间调用DrawText。

但是,有时在调用DrawText方法时会出现 SEHException 。只有从背景线程调用时才会从 UI线程调用它。 这不会发生在每台计算机上。它经常发生在某些人身上,而在其他人身上根本无法复制 VS Debugger所说的确切消息是:“x.DLL中出现'System.Runtime.InteropServices.SEHException'类型的第一次机会异常”,当我调用 ID2D1DeviceContext.DrawText() function,调试器在DrawText调用的d2d1.h头文件中断。

有什么方法可以调试或诊断抛出SEHException时出错的地方? (它显然与从后台线程调用DrawText函数有关。)
除此之外,是否有任何从后台线程调用DirectX函数的一般规则? (我确保使用D2D1_FACTORY_TYPE_MULTI_THREADED选项创建D2D1Factory。)

3 个答案:

答案 0 :(得分:3)

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

因此,所有SEH异常都会告诉您“某些Windows函数引发异常”。与任何其他例外一样,这可能由于很多原因而发生。

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

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

答案 1 :(得分:0)

问题只发生在一台计算机上,无法在其他计算机上复制。在视频卡驱动程序更新后,它也停止在该计算机上,因此可能存在一些驱动程序问题(Windows 8的Nvidia驱动程序已经存在一些问题)。

答案 2 :(得分:0)

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