Qt:GUI在使用线程和信号/插槽时有时会冻结

时间:2011-11-14 14:55:51

标签: multithreading qt

我有两个(替代)功能处理由传感器提供的数据。这些函数在它们自己的线程中运行,并在结果准备好后发出信号。此信号连接到UI小部件的插槽,显示结果。 有一个功能,这很好用。然而,当使用另一个时,GUI开始滞后并很快冻结。

QDebug显示数据仍在处理中。

在GUI线程中运行代码时,没有问题。

问题可能是worker-thread生成数据的速度比UI可以绘制得快,导致Qt :: QueuedConnection导致一些延迟?如果是这样,我有什么替代方案?如果没有,我还能检查什么?

2 个答案:

答案 0 :(得分:3)

似乎工作者线程正在向UI线程发送垃圾邮件,填满主事件循环,以便GUI事件很难得到处理。

如果没有看到工作线程中的某些代码,则很难推荐解决方案。在一天结束时,您只想按指定的时间间隔发出信号。

您可能会对QTime课程感到满意。每次发出信号时,请致电QTime::start,然后检查QTime::elapsed值。只有当它高于某个阈值时才会发出信号并重置定时器。

如果您可以丢弃中间传感器值,那就是理想值。如果您需要它们,则必须将它们添加到QVector或其他内容,并在信号中一次性发送它们。

更好的是,如果您只能定期轮询传感器本身。在这种情况下,QTimer类可能很有用 - 让它每次轮询传感器(并发出信号)"滴答"。

答案 1 :(得分:0)

我实际上只是设法找到了一个解决方案:在一个单独的线程中完成的数据处理是经常轮询传感器类的方式。因此,来自传感器的每个样本都会向UI线程发出几次信号。

通过在处理线程中加入QWaitCondition,我设法达到了更合理的刷新率。

然而,非常感谢你的回答。