从高度动态的C 数据模型中更新QML:计时器与属性绑定
Updating QML from highly dynamic C++ data model: Timer vs Property binding
假设一个C 业务模型,该模型可能会很快更改其基础数据(例如,最多高达1000 Hz)。在我的具体情况下,这将是围绕网络数据回调机制(更精确的Ros-Subscriber)包装,以其自己的线程运行。将数据视为一些传感器读数。进一步假设我们正在处理简单的数据,例如在最坏情况下一个双重值或字符串。
在QML组件中可视化此类数据的最佳方法是什么?最好的是,在资源方面保持温和,最大程度地减少模型状态和视图之间的延迟,并尽可能干净?
我提出了以下选项:
-
将数据作为模型的属性绑定到视图中,并在每个更新的数据上发出datachanged()信号:
- pro:优雅的代码,在数据更新速率较低的情况下,资源使用最低。
- con:高信号频率将垃圾邮件垃圾邮件并最大化资源利用率,可能会使系统无响应。
-
使用QML -Timer并以特定的间隔进行轮询模型(例如10-60 Hz):
- Pro:资源利用率的上限,稳定利率
- con:计时器本身消耗资源;不像数据绑定那么优雅;如果数据生成/回调率低于计时器率,则必须进行不必要的民意调查。
-
使用数据绑定如1所示。但是使用QTimer(或其他计时器(如BOOST))在C 模型内的信号发射频率,即仅在特定的间隔内发射datachanged()信号:
- pro:与2相同。
- con:与2。 相同
-
组合来自3的计时器。通过某种检查数据是否实际更改,在发出信号之前是否实际更改,因此如果数据没有更改,则避免了不必要的信号:
- pro:与3相同。
- con:与3相同。但甚至不那么优雅;诱发错误的风险增加,因为逻辑更为复杂;模型很难重复使用,因为数据更改检查很大程度上取决于数据的性质
我是否错过了一个选项(除了首先没有产生这么多数据)吗?您的选择是什么或最大的QT/QML实现这一目标?
首先,您是否确定存在性能问题?
我的意思是被授予,每秒1000个更新足够,但是这可能会强制GUI更新每秒1000倍吗?还是GUI仅在渲染新框架时才更新?任何远程理智的GUI框架都可以正是这样。即使您的数据每秒更改了Gazzilion时间,GUI更改也只会以GUI呈现的帧速率反映。
话虽如此,您可以努力减少后端的压力。典型的"便利性"实现将负担系统的负担,即使QT支持的任何当代平台都可以处理1000 Hz的一个或两个物体,如果有很多,那么您也应该努力减少它。而且,即使对系统性能不利,效率也总是良好的,只要它的成本开发太高。我不建议使用属性或模型接口直接更新数据,因为这会充斥信号通知。您应该在低级别上静静地处理基础数据更新,仅定期告知更改的属性或模型接口。
如果您的更新是连续的,只需设置一个计时器,30 Hz甚至更少的OUTTA就可以了。
如果不是,则可以使用"脏"标志。当数据更改时,设置标志并启动更新计时器作为单次拍摄,当计时器触发并通知更新时,它会清除标志并悬挂。这样,您可以避免运行计时器而无需任何更新。
- Linux的Cpp上的计时器
- 提升 ASIO 无法识别计时器对象
- 提升 asio 并发计时器取消问题与链
- 使用单体计时器的pthread_cond_timedwait有时会比预期晚超时
- 窗口中的微秒计时器
- 计时器是否从另一个线程启动?
- 如何在 c++ 中创建计时器
- C++回调计时器实现
- 在计时器或主线程外部的命令上销毁/替换线程
- 如何制作每秒从 30 乘 1 倒计时的计时器?
- 保留计时器集合(对象与指针)的最佳方法
- 在网络套接字计时器滴答后增加asio短读错误
- 是否可以仅使用标准 c++/c++11 实现不带"sleep"的计时器?
- 在没有NtSetTimerResolution的Windows上提高计时器分辨率(高分辨率)
- 计时器坏了或者其他什么的
- 功能计时器阻止主功能继续
- IO服务重新启动后,Boost最后期限计时器持续触发
- QML 计时器未触发
- 从高度动态的C 数据模型中更新QML:计时器与属性绑定
- QML 计时器 - 如何提高准确性