使用C#实时应用程序

C#可以用于开发一个实时应用程序,包括从networking摄像头持续input和处理input?

Solutions Collecting From Web of "使用C#实时应用程序"

我已经使用C#创建了多个实时,高速的机器视觉应用程序,这些应用程序全天候运行,并且依赖应用程序移动机器。 如果软件出了问题,在现实世界中立即出现明显的错误。

我发现C#/ .Net提供了非常好的功能。 正如其他人所说,绝对停留在垃圾收集之上。 分解成几个逻辑步骤,并有独立的线程工作。 我发现生产者消费者编程模型对此很有效,对于初学者来说可能是ConcurrentQueue 。

你可以从这样的开始:

  • 线程1捕获相机图像,将其转换为某种格式,并将其放入一个ImageQueue中
  • 线程2从ImageQueue中消耗,处理图像,并产生一个数据对象,将其放到ProcessedQueue
  • 线程3从ProcessedQueue中消耗,并对结果做一些有趣的事情。

如果线程2时间太长,线程1和3仍然在一起。 如果你有一个多核处理器,你将在数学上投入更多的硬件。 您也可以使用多个线程来代替上面写的任何线程,但是您必须小心地手动对结果进行排序。

编辑

在阅读其他人的答案后,你可能会争论我的“实时”的定义。 在我的情况下,电脑产生的目标,它发送到运动控制器做实际的实时运动。 运动控制器提供了自己的安全层,如定时,最大/最小范围,平滑加速/减速和安全传感器。 这些控制器在整个工厂读取传感器的周期时间小于1ms。

垃圾收集有时会在规定的时间内停止系统响应,因此不能将任何主流垃圾收集语言用于“硬实时系统”。 避免分配对象可以提供帮助,但是您需要一种方法来证明您没有创建任何垃圾,垃圾收集器也不会启动。

然而,大多数“实时”系统实际上并不需要总是在困难的时间内做出回应,所以这一切都是按照“实时”的意思来做的。

即使系统的某些部分经常需要“硬实时”,系统的其他大部分部分也不会像UI一样。

(我认为你的应用程序需要快速而不是“实时”,如果每100年一帧丢失,会有多少人死亡?)

绝对。 关键是要尽可能地避免垃圾回收和内存管理。 尽可能避免使用新对象,尽可能使用缓冲区或对象池。

  • 当然,有人甚至开发了一个库来做到这一点: AForge.NET
  • 和任何实时应用程序一样,不仅仅是C#,你必须像@David建议的那样管理缓冲区。
  • 不仅如此,还有XNA框架 (适用于3D游戏等),并且可以使用C# 编写DirectX程序,这些都是非常实时的。
  • 你知道吗,如果你愿意,你可以在C#中做指针操作 ?

这取决于如何“实时”它需要; 即你的时间约束是什么,以及你需要多快才能“做点什么”。

如果你可以在.NET中每隔300毫秒左右处理“做某事”,比如在计时器事件上,我发现Windows可以正常工作。 请注意,这是我在不同年龄和不同速度的多个系统上发现的事情。 一如既往,YMMV。

但是这个数字对于很多应用来说是非常长的。 也许不适合你。

做一些调查,确保你的应用程序响应速度足够你的应用程序。