2012-10-04 34 views
0

我正在处理一个我并不熟悉的相当庞大而复杂的代码库,它使用DirectWrite进行文本渲染。我不知道是否重要,但这是一个WinRT(Windows应用商店)应用程序。多线程DirectX代码中SEHException的原因是什么?

该应用程序是多线程,并且某些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。)

+1

听起来像是一种竞争条件。 – Dani

+0

当结构化异常被抛出时,程序在做什么? (即什么在堆栈上?执行什么功能?它是你的代码还是平台代码?)抛出什么异常? (所有的本地异常都是使用结构化异常处理来处理的,所以“SEH异常抛出某处”并不特别有用。) –

+0

我用确切的异常消息和抛出的位置澄清了问题。 –

回答

0

该问题只出现在单台电脑上,无法在其他电脑上复制。并且在显卡驱动程序更新之后,它也停止在该计算机上,因此可能会出现一些驱动程序问题(Windows 8的Nvidia驱动程序已出现一些问题)。

3

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

因此,一个SEH异常告诉你是“某些Windows函数抛出异常”。与其他任何例外情况一样,这可能有很多原因。

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

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

+0

谢谢,这澄清了它对我的意义。那么是否有任何方法可以在抛出SEHException时调试或诊断到底发生了什么错误?一般来说,从后台线程调用DrawText等DirectX函数并不违法,是吗? –

+0

我无法帮助你。从历史上看,DirectX有很多多线程的限制,但我不知道D2D如何专门处理它。 – jalf

0

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

相关问题