【发布时间】:2012-09-26 13:02:00
【问题描述】:
我在弄清楚我应该如何构建我的程序时遇到了一些麻烦。我将首先描述我的程序的一般描述,然后介绍我尝试过的事情和遇到的问题。我不是在开发游戏,而是在开发一套计算机化测试来测试人类视觉。我知道这篇文章有点长,但我想尽可能清楚地说明我遇到的问题。提前致谢!
设计:该程序提供一个“主菜单”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 调用它。这工作得很好,直到我尝试处理用户 ALT-TAB、CTRL-ALT-Delete、覆盖窗口(在窗口模式下时)等时出现的 DeviceLostExceptions 和类似问题。)我还没有找到有效的方法来处理这些类型的错误,而无需连续渲染场景。
所以我决定尝试重写 SDO 类以使用 SlimDXs MessagePump.Run() 功能不断渲染场景,但这会导致异常,因为 SDO MessagePump.Run() 与“主菜单”WinForm 的 MessagePump 冲突(至少我认为这就是该错误消息的含义:“附加信息:在单个线程上启动第二个消息循环不是有效操作。”)。我决定尝试在一个新线程中创建 SDO 对象,但是我无法在 TestObject 和 SDO 对象之间进行通信以添加/删除/更改 SO 对象。我不能 100% 确定创建多线程应用程序是最好的方法,因为我已经读过 DX 和线程会导致编程噩梦,但我没有看到任何其他解决方案。我想我需要学习使用某种线程同步,但我对线程非常陌生,我想确保在我投入大量时间学习同步之前,我不会走上注定失败的道路线程。如果创建多线程应用程序是最佳选择,我应该注意任何 DX/SlimDX 线程问题吗?任何跨线程同步数据的简单 SlimDX 线程程序示例?感谢您花时间阅读这篇文章,我将非常感谢您提供的任何建议。
【问题讨论】:
-
如果你更简洁,你会增加你的观众!
-
是的...这是我的一个坏习惯,我会牢记这一点。
-
太搞笑了:你写了一本书,有人发一本书作为回复:-)
标签: .net vb.net multithreading directx slimdx