【问题标题】:Qt: GUI sometimes freezing when using threads and signals/slotsQt:使用线程和信号/插槽时,GUI 有时会冻结
【发布时间】:2011-11-14 14:55:50
【问题描述】:

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

QDebug 显示数据仍在处理中。

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

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

【问题讨论】:

  • 我们真的需要一些代码来帮助您解决这个问题。我唯一疯狂的猜测是,工作线程正在向 UI 线程发送垃圾邮件,其结果超出了它可能处理的范围。你能控制一下它进行测试,看看它是否有所作为?
  • 在包含一个大的、不必要的循环之后,它运行得更加流畅。所以是的,这似乎表明工作线程太快的问题,正如你和我所怀疑的那样。我现在能做什么?
  • 我将讨论转移到一个答案,因为我们似乎已经确认了根本原因......

标签: multithreading qt


【解决方案1】:

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

没有看到工作线程中的一些代码,很难推荐解决方案。归根结底,您只想在指定的时间间隔发出信号。

QTime 课程可能会让您有一些运气。每次发出信号时,调用QTime::start,然后检查QTime::elapsed 的值。只有当它超过某个阈值时才会发出信号并重置计时器。

如果您可以丢弃中间传感器值,那就太理想了。如果你需要它们,你必须将它们添加到QVector 或其他东西,然后在信号中一次发送它们。

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

【讨论】:

    【解决方案2】:

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

    通过在处理线程中包含 QWaitCondition,我设法降低到更合理的刷新率。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 2015-07-18
      • 2013-09-27
      • 1970-01-01
      相关资源
      最近更新 更多