【问题标题】:Realtime Display of Data数据实时显示
【发布时间】:2011-07-02 22:15:34
【问题描述】:

我正在设计一个应用程序来收集我的车辆数据并将其显示在应用程序上。我试图弄清楚我的软件的最佳架构是什么。我计划将 Qt 用于我的 gui (QPainter),并且我有从传感器收集数据的自定义硬件。我在想硬件 I/O 将驻留在在自己的线程中呈现图形的应用程序中,但现在我认为将所有硬件 I/O 通信放在一个单独的进程中并在两者之间进行通信可能会更好使用一些 IPC 协议的进程(不确定是哪一个)。

你们建议我做什么。这也是我第一次编写多进程应用程序。

【问题讨论】:

  • Real realtime,还是足够快/互动性强以至于人们不会关心/注意到?
  • 我希望它足够快,以便我注意到数据中的任何滞后。试图用这个应用程序替换我的项目车的仪表盘。
  • 这几乎从来都不是一个错误。炸毁昂贵火箭的最佳方法。

标签: c++ qt software-design architecture


【解决方案1】:

我已经写了数百次这样的事情。到目前为止,最好的解决方案是将专用硬件拆分为两个线程或任务:

  • 可以执行任何需要的实时操作
  • 另一个响应来自 UI 的数据查询和命令

这两个线程相互协作以维护一致的、受信号量保护的共享变量空间。第二个线程在锁定共享空间之前完成所有解析和诸如此类的工作,复制它需要的任何内容,然后解锁。目标是将锁定间隔限制为尽可能短的时间。通常,将所有共享变量排列到一个结构中并使用大容量 memcpy() 是很实用的,即使只有少数成员感兴趣。这种交互越简单越好。

用户界面包含

  • 屏幕在可见且处于活动状态时会导致对数据模块的定期查询

其他架构也是可能的,但每当我看到它们时,它们都会演变成大量的补丁来解决同步和时序问题。

【讨论】:

  • 将其分成线程(Gui 和硬件单独的线程)或将它们分成单独的进程会更好。是否比其中一个有优势。就像一个进程崩溃一样,另一个可以重新启动它。
  • 取决于平台。例如,使用 Microsoft Windows,我会在单个进程中使用线程,因为它在进程间通信方面存在弱点。使用 Linux,无论哪种方式都可以——无论哪种方式对您来说更自然。
  • 好的,我打算使用 Minimal Ubuntu 作为我的操作系统,因为它的重量很轻。希望这将有助于提高应用程序的实时性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 2013-03-18
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多