【问题标题】:Qt C++ "keine Rückmeldung" - Error in GUI during long calculationsQt C++ “keine Rückmeldung” - 长时间计算时 GUI 出错
【发布时间】:2017-09-22 03:51:14
【问题描述】:

我有一个关于长计算的问题:

在执行我的 GUI 的某些任务时,可能会完成长时间计算。这不是问题,只是需要一段时间——一切正常(至少结果很好)。

困扰我的是,一段时间后我的 GUI 似乎没有响应:例如,在计算过程中显示的我的 ProcessBar 将不会显示,并且在我的 GUI 的标题栏中,文本 “添加了 keine Rückmeldung”(这意味着诸如忙碌、崩溃等 - 抱歉,我不知道正确的翻译,这让我很难在互联网上找到有关该问题的任何信息)。

是否有可能阻止这种行为?

谢谢。

【问题讨论】:

  • 如果我们可以检查您的代码,那就太好了。可能是您分配了兆字节的内存,或者值太大。
  • 对不起,这是不可能的,因为代码很长。是否有可能通常停止此消息 + 行为?
  • 您可能会将其翻译为“无响应”。至于您的问题,可能是因为您在某个时间步骤内执行了太多命令。您可能希望将问题分成几块并在其间进行短暂的停顿,可能使用状态输出等。你需要让这个暂停有点合乎逻辑,以保持它的有机性。
  • 你必须将你的计算移动到单独的线程,这样你就不会阻塞 GUI 线程

标签: c++ qt user-interface responsiveness


【解决方案1】:

您应该将昂贵、持久的计算从 GUI 线程外包给工作线程,以防止 GUI 冻结。

Qt 文档:Threading Basics

QThread 用法很好的解释我觉得很有用:How To Really, Truly Use QThreads

不能通过工作线程更改 GUI 本身。你必须notify你的主线程关于数据更改并从那里更新你的GUI。

【讨论】:

    【解决方案2】:

    你有两个选择。更有效的方法是将您的计算放入另一个线程(或多个线程,现代 PC 中很少有单核 CPU)。 JSilver's answer 为您提供了一些链接。

    但是,随着线程的出现,您必须学习和考虑大量与线程相关的东西。如果您不知道自己在做什么,那么有很多潜在的潜在错误。所以我会推荐替代方法作为第一步,单线程。作为奖励,它将使以后更容易迁移到多线程解决方案。

    1. 创建一个普通的 QObject 子类。在这个 QObject 中,将计算的状态作为成员变量。

    2. 在上面的类中写一个槽方法,它会做一小部分计算,然后返回。为了获得良好的用户体验,它最多应该在 50 毫秒左右完成。您可以在循环中使用固定数量的迭代,或使用QElapsedTimer 来测量时间,或其他。然后,当再次调用时,该方法应再次继续计算 50 毫秒。当计算完成时,该方法可以例如发出带有结果的信号

    3. 添加一个间隔为 0 的QTimer。将超时连接到上述槽方法。此处的间隔 0 实际上意味着 Qt 将尽可能频繁地调用该方法。你想要这个,因为你当然希望计算尽快完成。但是,由于该方法很快返回,所以 Qt 可以在再次调用您的方法之前执行其他操作(更新 GUI 等)。

    一旦这工作,在单线程中,您就可以学习使用 Qt 线程并将工作对象移动到另一个线程中,以潜在地提高性能。此外,如果您遇到线程问题,您将有一个单线程基线版本进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      相关资源
      最近更新 更多