2009-04-07 73 views
0

我正在調試一個應用程序(主要是)在非託管代碼上的Winforms UI。一些UI代碼不是WinForms:它使用DirectX直接繪製到某些Panel組件的表面上。爲此,組件的窗口句柄在創建後會被記錄下來,並且任何後續調用都需要使用執行此DirectX顯示的模塊(例如GetWindowRect())的句柄來使用此句柄。這種機制已經存在了一段時間,沒有看到我要描述的問題,雖然也許我們只是幸運。把它放在適當位置的程序員已經不在我身邊了。使用Windows句柄使bgnd線程的DirectX調用安全嗎?

我想解決的問題是,非常間歇地,該區域的顯示被破壞。這個例程從後臺線程調用。例如,我在應用程序日誌中看到,對GetWindowRect()的調用會突然並伴隨繪圖問題返回垃圾座標。窗口句柄本身沒有被破壞,我相當確定我們沒有覆蓋Windows數據結構;我可以停止並重新啓動我們的顯示流,並且GetWindowsRect()將使用相同的Windows句柄重新開始返回良好的座標。

如果這是在.NET級別,我會使用Invoke將draw延遲到主線程。我的問題是,我們是否應該爲這個DirectX調用做同樣的事情?我試圖找到微軟有關不在後臺線程中繪圖的警告,以提醒自己是否擴展到使用Windows手柄;任何人都可以指向我嗎?

PC

回答

0

Window handles have thread affinity

最重要的用戶界面 元素當然是窗口。 窗口對象具有線程關聯。 創建窗口的線程是 ,窗口具有 不可分離的關係。非正式地, 一說,線程「擁有」 窗口。只有在擁有它的線程 上纔會將消息分派到 窗口過程,並且一般而言,對窗口的修改應該是 ,它只能由擁有 的線程進行。雖然窗口管理器 允許任何線程訪問這些 事情窗口的屬性,樣式, 和其他屬性,如 窗口過程,這樣的訪問 是線程從窗口 經理的角度來看安全, 負載修改 - 寫入序列應該 通常被限制在線程的所有者 。

相關問題