共用方式為


Direct3D 9 (多執行緒問題)

全螢幕 Direct3D 應用程式會提供 Direct3D 執行時間的視窗控制碼。 執行時間會連結視窗。 這表示所有傳遞至應用程式視窗訊息程式的訊息都已先由 Direct3D 執行時間自己的訊息處理常式進行檢查。

顯示模式變更會受到基礎作業系統內建的支援常式所影響。 發生模式變更時,系統會將數則訊息廣播至所有應用程式。 在 Direct3D 應用程式中,訊息會在視窗程式執行緒上接收,這不一定是呼叫 IDirect3DDevice9::ResetIDirect3D9::CreateDevice (或最終版本的 IDirect3DDevice9的相同執行緒,這可能會導致顯示模式變更) 。 Direct3D 執行時間會在內部維護數個重要區段。 由於 IDirect3DDevice9::ResetIDirect3D9::CreateDevice所造成模式參數中至少保留其中一個重要區段,因此當應用程式收到模式變更相關視窗訊息時,仍會保留這些重要區段。

此設計對多執行緒應用程式有一些影響。 特別是,應用程式必須確實將其視窗訊息處理執行緒與其 Direct3D 執行緒隔離。 在一個執行緒上造成模式變更但在其視窗程式中對不同執行緒進行 Direct3D 呼叫的應用程式有死結危險。

基於這些原因,Direct3D 的設計目的是讓 IDirect3DDevice9::ResetIDirect3D9::CreateDeviceIDirect3DDevice9::TestCovel或最終的 IDirect3DDevice9 版本只能從處理視窗訊息的相同執行緒呼叫。

程式設計提示