响应式 Qt GUI,即使是线程

Posted

技术标签:

【中文标题】响应式 Qt GUI,即使是线程【英文标题】:Responsive Qt GUI even if threading 【发布时间】:2015-05-31 13:15:39 【问题描述】:

所以假设你有很多东西要绘制,采样时间为 10 毫秒,即 9 个图表/图形(基于 qcustomplot 库)和一个 GLWidget。现在所有的计算,我的意思是数学,都是在一个单独的线程中执行的,但是像“填充 #1 图表的数组”或“清理图表”这样的指令是在 GUI 线程中执行的(显然以 10 毫秒的速度) .

我的问题是,基本上,由于绘图的频率很高,按钮变得没有响应。

现在我的问题是: 有没有办法提高我的代码的性能?我想避免每 50 毫秒而不是每 10 毫秒绘制一次。可能的解决方案是使用 qApp->processEvents(); ?有没有更优雅的方式?

【问题讨论】:

你可以做的一件事(如果你还没有这样做的话)是在另一个线程中渲染一个适当大小的 QImage 。然后将 QImage 传递给主线程,主线程只需将其转换为 Pixmap 并显示即可。这可能比每 10 毫秒执行一堆绘图命令更有效(至少在主线程中)。 【参考方案1】:

以 10 毫秒/每个样本的速度绘制任何东西是没有意义的。仅仅因为眼睛无法处理这个。你可以使用(如 cmets 中提到的)“双缓冲”并渲染所有内容您需要在单独的线程上显示并每秒刷新图像 100 次,但同样没有任何理由保持如此高的帧速率..

【讨论】:

由于即时获取数据我需要填充图表/图形..所以你可以清楚地注意到差异..放慢速度确实是一个解决方案 假设你在 50 毫秒内获得了 10 个样本。每 50 毫秒重绘一次或每 5 毫秒重绘 10 次没有区别,用户几乎不会注意到任何区别【参考方案2】:

如果您希望 GUI 响应更快,请在占用大量 CPU 周期的任何代码中定期调用 QCoreApplication::processEvents();。您需要在调用的任何模块中使用#include <QCoreApplication>。顺便说一句,由于额外的函数调用,这实际上会损害性能,但它会使 GUI 响应更快,这可能会使外观更好性能(具有讽刺意味)。

【讨论】:

qApp->processEvents() 一样吗? 我不知道,但是使用qApp 方法,您需要在其中调用processEvents() 的每个对象都需要引用qApp 的实例。这意味着您要么必须将其设为全局,要么将其作为构造函数/方法参数传递,这两者都不是很干净。从QCoreApplication 调用等效的静态方法不需要引用或指向qApp 的指针。

以上是关于响应式 Qt GUI,即使是线程的主要内容,如果未能解决你的问题,请参考以下文章

热点关于响应式编程你可能错过的信息

QtConcurrent--在数以千计的结果发布到UI线程中保持GUI的响应。

响应式编程

mfc中嵌套qt,qt动态库里面用QAxwidget加载html网页后,qt界面非常卡

响应式网站设计最早是由谁提出的?为啥这么火?

响应式网页设计:div 宽度 + 填充不会跨越包含 div,即使它们等于 100%