我有两个(替代)函数处理传感器提供的数据。这些函数在自己的线程中运行,并在结果准备好时发出信号。该信号连接到 UI 小部件的插槽,显示结果。 使用其中一项功能,效果很好。然而,当使用另一个时,GUI 开始滞后并很快卡住。
QDebug 显示数据仍在处理中。
在GUI线程中运行代码时,没有问题。
问题可能是工作线程生成数据的速度比 UI 绘制数据的速度快,从而导致 Qt::QueuedConnection 导致一些延迟?如果是这样,我还有什么选择?如果没有,我还能检查什么?
最佳答案
工作线程似乎正在向 UI 线程发送垃圾邮件,填满主事件循环,导致 GUI 事件很难得到处理。
如果没有看到工作线程中的一些代码,就很难推荐解决方案。归根结底,您只想以指定的时间间隔发出信号。
您可能对 QTime
类有一些运气。每次发出信号时,调用 QTime::start
然后检查 QTime::elapsed
值。只有当它高于某个阈值时,才会发出信号并重置计时器。
如果您可以丢弃中间传感器值,那就太理想了。如果您需要全部,则必须将它们添加到 QVector 或其他东西中,并在信号中一次性发送它们。
如果您只能定期轮询传感器本身,那就更好了。 QTimer
类在这种情况下可能很有用——让它在每次“滴答”时轮询传感器(并发出信号)。
关于multithreading - Qt:使用线程和信号/槽时 GUI 有时会卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8123404/