【问题标题】:using C# for real time applications将 C# 用于实时应用程序
【发布时间】:2011-04-15 07:03:41
【问题描述】:

C# 能否用于开发一个实时应用程序,该应用程序涉及连续从网络摄像头获取输入并处理输入?

【问题讨论】:

  • 我不确定您的应用是否属于“实时”类别,因为在您的应用停止时缓冲视频并不重要。唯一重要的问题是处理缓冲区的速度要快于它们填满的速度。
  • Windows 并非旨在成为“实时”操作系统。考虑无法实时处理的后果:在您的情况下,故障模式是您错过了一帧视频,可能没什么大不了的。一个实时系统,例如,控制工厂中机器人手臂的位置,或在高速铁路线上移动轨道开关,如果操作超出其时间预算或控制切换到另一个线程,则会对人类生命安全产生非常真实的影响一阵子。我不认为你真的需要 realtime;我认为你只需要 fast。
  • @Eric:软实时系统和硬实时系统之间是有区别的。从网络摄像头获取输入对我来说似乎是一个软实时场景,Windows 应该没问题。
  • @Nemanja:可以使用 Windows 应用程序(但不确定基于 CLR 的应用程序)进行一些硬实时测量。我开发了一个在 Windows 上运行的 C++ 应用程序,它能够将实时确定性保持在大约 2 毫秒——尽管我们只指望它达到 10 毫秒。我们从一个单独的 RT 关键线程执行所有 RT,该线程被锁定在内存中并使用 Windows 多媒体计时器触发。通过运行 Venturcom RTX 之类的产品,您可以在 WIndows 机器上获得完整的硬实时(亚毫秒)。

标签: c# windows real-time


【解决方案1】:

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

然而,大多数“实时”系统实际上并不需要总是在硬时间限制内做出响应,所以一切都归结为你所说的“实时”。

即使系统的某些部分需要“硬实时”,但系统的其他大型部分(例如 UI)通常不需要。

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

【讨论】:

  • 用这个怎么样? Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
  • 这应该是公认的答案!! +1 垃圾收集对象会暂停几毫秒,因此时间限制将更新。
  • 除非你的时间限制是 1 秒并且你的程序的其余部分在 500 毫秒内运行?那么你有 500 毫秒的空闲时间用于垃圾收集?如果你远远低于时间限制,它真的那么重要吗?
  • “普通”垃圾收集器不会给出停止代码运行多长时间的上限。因此,它们在前 1000002 次收集垃圾的时间可能低于 500 毫秒,但随后需要很长时间,因为它们需要压缩由于发酵而产生的热量。
【解决方案2】:

我使用 C# 创建了多个实时、高速、机器视觉应用程序,这些应用程序可以 24/7 全天候运行,并且具有依赖于应用程序的移动机械。如果软件出现问题,现实世界中会立即出现明显的问题。

我发现 C#/.Net 提供了很好的功能。正如其他人所说,绝对要掌握垃圾收集。将处理分解为几个逻辑步骤,并且每个都有单独的线程工作。我发现 Producer Consumer 编程模型可以很好地解决这个问题,对于初学者来说可能是 ConcurrentQueue。

您可以从以下内容开始:

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

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

编辑

阅读其他人的答案后,您可能会争论我对“实时”的定义。在我的例子中,计算机生成目标,然后发送到执行实际实时运动的运动控制器。运动控制器为定时、最大/最小范围、平滑加速/减速和安全传感器等提供自己的安全层。这些控制器读取整个工厂的传感器,周期时间不到 1 毫秒。

【讨论】:

  • 如果您的软件每隔几周处理一次图像延迟会发生什么情况,其余设备是否会在您赶上时停止生产线。
【解决方案3】:

当然。关键是尽可能避免垃圾收集和内存管理。尽量避免使用新对象,尽可能使用缓冲区或对象池。

【讨论】:

  • 你能解释一下avoid garbage collection & memory management吗?避免这些有什么帮助?以及如何避免它们:)?
【解决方案4】:
  • 当然,有人甚至为此开发了一个库:AForge.NET
  • 与任何实时应用程序一样,而不仅仅是 C#,您必须按照 @David 的建议很好地管理缓冲区。
  • 不仅如此,还有XNA Framework(用于3D 游戏之类的东西),您还可以使用C# 对DirectX 进行非常实时的编程。
  • 你知道吗,如果你愿意,你也可以pointer manipulations in C#?

【讨论】:

  • 您知道,托管 DirectX 已被丢弃,因为它太慢了。
  • 这是一个很好的信息。 AForge.NET 对我很有用。谢谢
  • Here 一些有用的文档可用于 AForge 框架。
【解决方案5】:

这取决于它需要有多“实时”;即,您的时间限制是什么,以及您需要多快“做某事”。

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

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

做一些研究,确保您的应用对您的应用响应足够快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2014-05-10
    相关资源
    最近更新 更多