2012-09-26 75 views
0

我在計算如何構建程序時遇到了一些麻煩。我將首先描述我的程序的一般描述,然後討論我嘗試過的事情以及我遇到的問題。我不是開發遊戲,而是開發一套計算機化測試來測試人類視覺。我知道這篇文章有點長,但我想盡可能清楚我所遇到的問題。提前致謝!如何安全地將事件傳遞到線程。 SlimDX/DX9

設計:該程序午餐一個「主菜單」VB.Net形式,有很多選項來選擇不同類型的測試和配置不同的測試選項。當用戶單擊特定測試的RunTest按鈕時,會創建一個代表該測試的TestObject。 TestObject構造函數創建一個從SlimDX RenderForm類派生的StimulusDisplayObject(SDO)。 SDO類的工作是管理SlimDX設備對象並將不同的刺激呈現給屏幕。它包含一個StimulusObjects(SO)列表,它基本上只是一個從.bmp圖像加載的DX表面,以及一些用於告訴SDO類在屏幕上繪製表面的位置信息。在創建SDO之後,將調用TestObject.BeginTest()方法,這只是一個向觀察者呈現大量試驗的循環。該循環創建一些SO對象,並將它們添加到要顯示的SDO類的SO對象列表中。

問題:因爲我爲測試預設的刺激是相當靜態的,我通常只需要將顯示的圖像最多每秒或每兩秒更改一次,但我沒有持續在場景中渲染儘可能高的FPS。我只需要一個SDO.RenderScene(),只要需要在屏幕上進行更改,就會從TestObject調用。這工作相當不錯,直到我試圖處理DeviceLostExceptions和類似的問題,當用戶ALT-TABs,CTRL-ALT-刪除,覆蓋窗口(當在窗口模式)時,等等。)我還沒有找到一個有效的方法來處理這些類型的錯誤,而無需持續渲染場景。

因此,我決定嘗試重寫SDO類以使用SlimDXs MessagePump.Run()功能不斷地呈現場景,但是這會導致異常,因爲SDO MessagePump.Run()與「主菜單」的MessagePump衝突WinForm(至少我認爲這就是這個錯誤消息的含義:「附加信息:在單個線程上啓動第二個消息循環不是一個有效的操作。」)。我決定嘗試在新線程中創建SDO對象,但之後我無法在TestObject和SDO對象之間進行通信以添加/刪除/更改SO對象。我不是100%確定創建多線程應用程序是最好的方法,因爲我已經讀過DX和Threading導致編程惡夢,但我沒有看到任何其他解決方案。我認爲我需要學習使用某種線程同步,但是我對線程非常新,並且我想確保在投入很長一段時間學習同步之前我不會走向一條註定要失敗的道路線程。如果創建一個多線程的應用程序是最好的選擇,那麼我應該注意到有什麼DX/SlimDX線程問題?簡單的SlimDX線程化程序的任何例子,可以跨線程同步數據?感謝您花時間閱讀這篇文章,我會非常感謝您提供的任何建議。

+0

如果你更簡潔,你會增加你的觀衆! –

+1

是的......這是我的一個不好的習慣,我會牢記未來。 –

+0

太搞笑了:你寫了一本書,有人發帖回覆:-) –

回答

1

vanattab, 爲什麼不簽出這個在線(免費)書你將在.NET平臺上找到你需要知道的關於多線程的一切(很好,大多數)。它是面向C#的,但是相同的技術適用於VB。

http://www.albahari.com/threading/

+0

感謝您的鏈接。我會看看。 –

相關問題