如何安全地将事件传递给线程。 SlimDX / DX9

时间:2012-09-26 13:02:00

标签: .net vb.net multithreading directx slimdx

我在弄清楚如何构建程序时遇到了一些麻烦。我将首先描述我的程序的一般描述,然后介绍我尝试过的事情以及我遇到的问题。我不是在开发一款游戏,而是一套用于测试人类视觉的计算机化测试。我知道帖子有点长,但我想尽可能清楚地了解我遇到的问题。提前谢谢!

设计:该程序是一个“主菜单”VB.Net表格,它有很多选项可供选择不同类型的测试,并为测试配置不同的选项。当用户单击特定测试的RunTest按钮时,将创建表示该测试的TestObject。 TestObject构造函数创建一个StimulusDisplayObject(SDO),它派生自SlimDX RenderForm类。 SDO类的工作是管理SlimDX设备对象并向屏幕呈现不同的刺激。它包含一个StimulusObjects(SO)列表,它基本上只是一个从.bmp图像加载的DX表面和一些位置信息,用于告诉SDO类在屏幕上绘制表面的位置。在创建SDO之后,调用TestObject.BeginTest()方法,该方法只是一个循环,向观察者提供了许多试验。循环创建一些SO对象并将它们添加到要显示的SDO类的SO对象列表中。

问题:因为我为测试预设的刺激是相当静态的,我通常只需要每隔一两次更改一次显示在屏幕上的图像,我没有持续渲染场景。尽可能高的FPS。我只是有一个SDO.RenderScene(),只要需要在屏幕上更改某些内容,就可以从TestObject调用它。这很好用,直到我试图处理DeviceLostExceptions和用户ALT-TABs,CTRL-ALT-Delete,覆盖窗口(窗口模式)等时产生的类似问题等。)我还没有找到有效的方法处理这些类型的错误而不让场景不断渲染。

所以我决定尝试重写SDO类以使用SlimDXs MessagePump.Run()功能不断渲染场景,但这会导致异常,因为SDO MessagePump.Run()与“Main Menu”WinForm的MessagePump冲突(至少我认为这是错误消息的含义:“附加信息:在单个线程上启动第二个消息循环不是有效的操作。”)。我决定尝试在新线程中创建SDO对象但是我无法在TestObject和SDO对象之间进行通信以添加/删除/更改SO对象。我不是100%确定创建多线程应用程序是最好的方法,因为我已经读过DX和线程导致编程噩梦,但我没有看到任何其他解决方案。我想我需要学习使用某种线程同步,但我对线程非常新,我想确保在投入很长一段时间学习同步之前,我不会走上一条注定要失败的道路线程。如果创建一个多线程应用程序是最好的选择是否有任何我应该注意的DX / SlimDX线程问题?任何简单的SlimDX线程程序的例子,它们跨线程同步数据?感谢您抽出宝贵时间阅读本文,我将非常感谢您提出的任何建议。

1 个答案:

答案 0 :(得分:1)

vanattab, 为什么不查看这个在线(免费)书籍,在那里你会发现你需要了解的.net平台上多线程的一切(好吧,大多数)。它是面向C#的,但是相同的技术适用于VB。

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