我正在處理一個我並不熟悉的相當龐大而複雜的代碼庫,它使用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異常拋出某處」並不特別有用。) –
我用確切的異常消息和拋出的位置澄清了問題。 –