响应式 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的响应。