【问题标题】:Robot's Tracker Threads and Display机器人的跟踪器线程和显示
【发布时间】:2017-04-29 00:37:37
【问题描述】:

应用程序:目标应用程序有一个 tcp 服务器,能够处理与机器人的多个连接。 我选择使用数据库/无文件,所以我使用 sqlite db 来保存有关机器人及其完整历史记录、机器人模型、任务等的信息...... 机器人会向我们发送一些数据,例如里程计、任务信息等......

我为每个新机器人的连接创建一个线程来处理消息并更新数据库中机器人的信息。现在让我们开始谈谈我的问题:

应用程序必须实时显示有关机器人的信息,我正在考虑使用 QSqlQueryModel,设置正确的查询并将其显示在 QTableView 上,但后来我想到了一些问题/解决方案:

问题1: QTableView 上显示的信息不在数据库中:我有数据库的当前消耗和数据库的实际费用容量,但我想要还要在我的桌子上显示剩余电池时间,我如何在我的 TableView 中添加具有正确行为(数学实现)的列。

问题 2: 我将每秒收到每个机器人的消息,因此,当我有一个大问题时,更新 db 和 gui(加载查询)可能不是最好的解决方案连接的机器人数量?更新表是否更好,并且每分钟只更新数据库或类似的东西?如果我使用这种方法,我无法使用带有 QSqlQueryModel 的表来更新表,那么您推荐我使用什么方法?

谢谢 桑切斯

【问题讨论】:

  • 您能告诉我们到目前为止您尝试了哪些代码,以便我们为您修复它吗?
  • 我已经完成了服务器模块、连接线程、数据库设置和一些窗口,但我才刚刚开始设计如何在 GUI 上实现表行为,我不知道我该怎么办...

标签: multithreading qt qthread qlistview qsqltablemodel


【解决方案1】:
  1. 我以前也遇到过类似的问题;我的结论是 QSqlQueryModel 不是显示目的的最佳选择。您可能希望对查询结果进行一些处理,或者您可能希望根据结果创建、删除、更改显示数据以获得更高级的 gui。我认为最好的办法是实现自己的委托并覆盖视图相关的方法——setData、setEditor

通过这种方式,您可以控制所有列并直接合并原始数据及其显示等效项(即 EditData、UserData)。

  1. 是的,最好实时更新视图并以较低频率运行批处理以更新大数据。一般来说app是中间层,db是底层,用于数据监控,除非你在内存共享缓存中使用db。

编辑:重要的一点,你不能在多个线程中运行更新(你可以,但是 sqlite 会阻塞线程直到它获得锁)所以最好从单个线程运行更新

【讨论】:

  • 谢谢哥们。我也是 qt 的新手,但我要实施这个大项目,但我不知道所有可用的结构。那么你推荐我用什么结构来搜索你正在谈论的表的行为?我试图在多个线程上运行,并在想当我需要在线程中实现查询时使用互斥锁,并且刷新主窗口表元素也是如此。不行吗?
  • 你可以通过 qt 示例“spin box delegate”和“star view delegate”。您将了解模型/视图架构的工作原理。
  • 再感谢一次。还有一件事,我的桌子的行数取决于连接的机器人的数量。所以会随着时间变化。要更新我想要的行,我需要知道正确的索引是该机器人的信息。有没有办法为一行设置一个 ID 或其他东西,而不是使用每次机器人断开连接时都会变化的索引?
  • 您可以使用 id 字段创建模型,隐藏该列以进行显示。直截了当
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多