我正在处理一个我并不熟悉的相当庞大而复杂的代码库,它使用DirectWrite进行文本渲染。我不知道是否重要,但这是一个WinRT(Windows应用商店)应用程序。多线程DirectX代码中SEHException的原因是什么?
该应用程序是多线程,并且某些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。)
听起来像是一种竞争条件。 – Dani
当结构化异常被抛出时,程序在做什么? (即什么在堆栈上?执行什么功能?它是你的代码还是平台代码?)抛出什么异常? (所有的本地异常都是使用结构化异常处理来处理的,所以“SEH异常抛出某处”并不特别有用。) –
我用确切的异常消息和抛出的位置澄清了问题。 –