Каковы причины SEHException в многопоточном коде DirectX?

Я работаю с довольно большой и сложной кодовой базой, с которой я не знаком, которая использует DirectWrite для рендеринга текста. Я не знаю, имеет ли это значение, но это приложение WinRT (Windows Store).

Приложение многопоточный, и некоторые вызовы DirectX выполняются из фонового (не пользовательского) потока. Все BeginDraw а также EndDraw звонки сделаны из Пользовательский интерфейс, и некоторые из DrawText звонки сделаны из фон потоки. Я убедился, что ни один из этих вызовов не перекрывается, и DrawText вызывается только между парами BeginDraw и EndDraw.

Однако иногда я получаю SEHException при вызове метода DrawText. Это никогда не происходит, когда он вызывается из Пользовательский интерфейс, только когда вызывается из фон нить.
Это не происходит на каждом компьютере. Это очень часто случается с некоторыми, и не может быть воспроизведено вообще на других.
Точное сообщение отладчика VS: «Первое случайное исключение типа« System.Runtime.InteropServices.SEHException »произошло в x.DLL», и это происходит, когда я вызываю ID2D1DeviceContext.DrawText () функции, и отладчик прерывается в заголовочном файле d2d1.h при вызове DrawText.

Есть ли способ отладки или диагностики, что происходит, когда выдается исключение SEHException? (Он явно связан с вызовом функции DrawText из фонового потока.)
И кроме этого, есть ли какие-либо общие правила вызова функций DirectX из фоновых потоков? (Я убедился, что D2D1Factory создается с опцией D2D1_FACTORY_TYPE_MULTI_THREADED.)

0

Решение

Исключение SEH — это просто исключение Win32: механизм исключений, используемый Windows для внутренних целей, который отличается от исключений C ++.

Таким образом, все исключение SEH говорит вам, что «некоторая функция Windows вызвала исключение». Как и с любым другим исключением, это может произойти по многим причинам.

Поэтому спрашивать, каковы «обычные причины» такого исключения, отчасти бесполезно.

Каковы обычные причины для std::exception? Их очень много.

3

Другие решения

Проблема возникла только на одном компьютере и не может быть воспроизведена на других. И после обновления драйвера видеокарты оно также прекратилось на этом компьютере, так что, возможно, это была некоторая проблема с драйвером (уже были некоторые проблемы с драйверами Nvidia для Windows 8).

0

Обязательно включите среду отладки DirectX. Беги в визуальную студию. Он имеет очень подробную проверку ошибок, которая выводится на консоль. Чтобы включить его, запустите панель управления DirectX.

0
По вопросам рекламы [email protected]