Multithreading 机器人&x27;s跟踪线程和显示

Multithreading 机器人&x27;s跟踪线程和显示,multithreading,qt,qthread,qlistview,qsqltablemodel,Multithreading,Qt,Qthread,Qlistview,Qsqltablemodel,应用程序:目标应用程序有一个tcp服务器,能够处理与机器人的多个连接。 我选择使用数据库/无文件,因此我使用sqlite db保存有关机器人及其完整历史、机器人模型、任务等的信息。。。 机器人向我们发送了一些数据,如里程计、任务信息等 我为每个新机器人的连接创建一个线程来处理消息并更新数据库中机器人的信息。现在让我们开始谈谈我的问题: 该应用程序可以实时显示有关机器人的信息,我正在考虑使用QSqlQueryModel,设置正确的查询并在QTableView上显示,但随后我想到了一些问题/解决方案

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

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

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

问题1:QTableView上显示的信息不在数据库中:我有数据库中的当前消耗量和数据库中的实际容量,但我想在表中显示剩余电池时间,如何以正确的行为添加该列(数学实现)在我看来

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

谢谢 桑切斯

  • 我以前也遇到过类似的问题;我的结论是,QSqlQueryModel不是用于显示目的的最佳选项。您可能需要对查询结果进行一些处理,或者您可能需要根据结果为更高级的gui创建、删除、更改显示数据。我认为最好是实现您自己的委托,并重写与视图相关的方法-setData、setEditor
  • 通过这种方式,您可以控制所有列,并直接合并原始数据及其显示等价物(即EditData、UserData)

  • 是的,如果您实时更新视图并以较低的频率运行批处理执行来更新大数据,效果会更好。一般来说,应用程序是中间层,db是数据监控的底层,除非您使用内存共享缓存中的db

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

    你能告诉我们到目前为止你尝试了哪些代码,以便我们为你修复它吗?我已经完成了服务器模块、连接线程、数据库设置和一些窗口,但我只是开始设计如何在GUI上实现表的行为,我不知道该怎么做…谢谢你。我在qt也是新手,但我有一个大项目要实施,我不知道所有可用的结构。那么,您建议我使用什么结构来搜索您正在谈论的表的行为呢?我试图在多个线程上运行,并认为当我需要在线程中实现查询时,可以使用互斥体,同样地,也可以刷新主窗口表元素。它不起作用吗?您可以通过qt示例“旋转框代理”和“星形视图代理”。您将了解模型/视图体系结构是如何工作的。再次感谢您。还有一件事,我的桌子的行数取决于连接的机器人的数量。因此,它将随时间而变化。要更新我想要的行,我需要知道正确的索引是该机器人的信息。是否可以为行设置ID或其他内容,而不是使用每次机器人断开连接时都会变化的索引?您可以使用ID字段创建模型,隐藏该列以供显示。直截了当的