我有两个(替代)功能处理由传感器提供的数据。这些函数在它们自己的线程中运行,并在结果准备好后发出信号。此信号连接到UI小部件的插槽,显示结果。 有一个功能,这很好用。然而,当使用另一个时,GUI开始滞后并很快冻结。
QDebug显示数据仍在处理中。
在GUI线程中运行代码时,没有问题。
问题可能是worker-thread生成数据的速度比UI可以绘制得快,导致Qt :: QueuedConnection导致一些延迟?如果是这样,我有什么替代方案?如果没有,我还能检查什么?
答案 0 :(得分:3)
似乎工作者线程正在向UI线程发送垃圾邮件,填满主事件循环,以便GUI事件很难得到处理。
如果没有看到工作线程中的某些代码,则很难推荐解决方案。在一天结束时,您只想按指定的时间间隔发出信号。
您可能会对QTime
课程感到满意。每次发出信号时,请致电QTime::start
,然后检查QTime::elapsed
值。只有当它高于某个阈值时才会发出信号并重置定时器。
如果您可以丢弃中间传感器值,那就是理想值。如果您需要它们,则必须将它们添加到QVector
或其他内容,并在信号中一次性发送它们。
更好的是,如果您只能定期轮询传感器本身。在这种情况下,QTimer
类可能很有用 - 让它每次轮询传感器(并发出信号)"滴答"。
答案 1 :(得分:0)
我实际上只是设法找到了一个解决方案:在一个单独的线程中完成的数据处理是经常轮询传感器类的方式。因此,来自传感器的每个样本都会向UI线程发出几次信号。
通过在处理线程中加入QWaitCondition,我设法达到了更合理的刷新率。
然而,非常感谢你的回答。