2012-10-04 68 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控制面板。

相關問題