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

Multithreading Qt:GUI在使用线程和信号/插槽时有时会冻结,multithreading,qt,Multithreading,Qt,我有两个(可选)功能处理传感器提供的数据。函数在自己的线程中运行,并在结果就绪时发出信号。此信号连接到UI小部件的插槽,显示结果。 对于其中一个函数,它工作得很好。然而,当使用另一个图形用户界面时,图形用户界面开始延迟并很快冻结 QDebug显示数据仍在处理中 在GUI线程中运行代码时,没有问题 问题可能是工作线程生成数据的速度快于UI绘制数据的速度,从而导致Qt::QueuedConnection造成的延迟?如果是,我有什么选择?如果没有,我还可以检查什么?工作线程似乎正在滥发UI线程,填充主

我有两个(可选)功能处理传感器提供的数据。函数在自己的线程中运行,并在结果就绪时发出信号。此信号连接到UI小部件的插槽,显示结果。 对于其中一个函数,它工作得很好。然而,当使用另一个图形用户界面时,图形用户界面开始延迟并很快冻结

QDebug显示数据仍在处理中

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


问题可能是工作线程生成数据的速度快于UI绘制数据的速度,从而导致Qt::QueuedConnection造成的延迟?如果是,我有什么选择?如果没有,我还可以检查什么?

工作线程似乎正在滥发UI线程,填充主事件循环,因此GUI事件很难得到处理

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

QTime
类中,您可能会有一些运气。每次发出信号时,调用
QTime::start
,然后检查
QTime::appead
值。只有当它高于某个阈值时,才会发出信号并重置计时器

如果您可以扔掉中间传感器值,这是理想的。如果您需要全部,则必须将它们添加到
QVector
或其他东西中,并在信号中一次性发送它们

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


实际上,我刚刚找到了一个解决方案:在一个单独的线程中完成的数据处理是以经常轮询传感器类的方式进行的。因此,对于来自传感器的每个样本,向UI线程发送多次信号

通过在处理线程中包含一个QWaitCondition,我设法获得了一个更合理的刷新率


不过,非常感谢您的回答。

我们确实需要一些代码来帮助您解决这个问题。我唯一的猜测是,工作线程正在向UI线程发送垃圾邮件,其结果超出了它可能处理的范围。你能在它上面加一个油门进行测试,看看它是否有区别吗?在加入一个大的,不必要的循环后,它运行得更平稳。所以,是的,这似乎表明工作线程速度过快存在问题,正如您和我所怀疑的。我现在能做什么?我将讨论转移到一个答案,因为我们似乎已经确认了根本原因。。。。