我们有一个Qt C ++ Gui应用程序,它基本上是控制它并显示其数据的服务器(TCP)软件的终端。
问题是来自服务器的数据是高度关系数据。 在SQL术语中,它将是〜10-15个表,所有表都通过一些外键互连
此数据由服务器更新,并且必须(同时)由GUI显示。
当前的解决方案是我们将所有数据存储在(基本上)映射和结构中,并使用适当的锁定(读/写)来避免并发访问的问题。
我们现在面临的问题是该解决方案不能很好地扩展。应用程序的性能(点击屏幕延迟时发生的事情)变得更糟。
使用应用程序中的关系数据库系统(如sqlite和内存数据库)会有帮助吗? 使用数据库(在查询时解决关系依赖关系)比使用结构图(在插入期间解决关系依赖关系)更好的扩展?
我希望我尽可能清楚地解决问题。
此致 安德烈
更清楚地说明:由于许多来自服务器的更新锁定了数据结构,因此GUI不再响应。
答案 0 :(得分:3)
(根据更新的评论说明实际问题,UI线程块)
这里有两个简单的修复方法可以提供帮助。第一个问题是在锁定共享数据结构之前预处理所有传入数据。例如,如果您在地图中有std::string
,则在地图上锁定时不要将const char*
转换为std::string
。这会在阻止UI线程的同时调用strlen
。而是先转换然后锁定地图。
第二个改进是将GUI锁定一小段时间。如果可以将更新分区为多个较小的部分,请重复执行并释放锁定。这意味着实际更新速度较慢,但UI响应速度较快。
更复杂的策略(如果分区不可能)是暂存。在新地图中创建所有新条目,然后合并这两个地图。这基本上是对类固醇的预处理,因为您现在也对新条目进行排序。 (我希望你能与服务器交换差异,而不是每次都重新刷新数据!)