Qt C++ "keine Rückmeldung" - 长时间计算期间 GUI 出错

Qt C++ "keine Rückmeldung" - Error in GUI during long calculations

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

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

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

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

谢谢。

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

Qt 文档:Threading Basics

我发现对 QThread 用法的很好解释很有用:How To Really, Truly Use QThreads

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

你有两个选择。更高效的是把你的计算放到另一个线程中(或者多线程,现代PC单核CPU很少)。 有一些链接供您使用。

但是,随着线程的出现,您必须学习和考虑大量与线程相关的事情。如果您不知道自己在做什么,则很可能会出现细微的错误。所以我会推荐替代方法作为第一步,单线程。作为奖励,它将使以后更容易转向多线程解决方案。

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

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

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

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