C++ Qt C++&引用;keine Rü;ckmeldung";-长时间计算期间GUI中出现错误

C++ Qt C++&引用;keine Rü;ckmeldung";-长时间计算期间GUI中出现错误,c++,qt,user-interface,responsiveness,C++,Qt,User Interface,Responsiveness,我有一个关于长时间计算的问题: 在执行GUI的某些任务时,可能会进行长时间的计算。这不是问题,只是需要一段时间——一切正常(至少结果良好) 困扰我的是,经过一段时间后,我的GUI似乎没有响应:例如,在计算过程中显示的myProcessBar将不会显示,并且在我的GUI的标题栏中添加了文本“keine Rückmeldung”(这意味着忙碌、崩溃等-抱歉,我不知道正确的翻译,这使得我很难在互联网上找到关于这个问题的任何信息) 有可能停止这种行为吗? 谢谢。您应该将昂贵、持久的计算从GUI线程外包给

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

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

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

有可能停止这种行为吗?


谢谢。

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

Qt文档:

我发现QThread用法的良好解释非常有用:


无法从工作线程更改GUI本身。您必须向主线程报告数据更改,并从主线程更新GUI。

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

Qt文档:

我发现QThread用法的良好解释非常有用:


GUI本身不能从工作线程更改。您必须向主线程报告数据更改,并从主线程更新GUI。

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

然而,随着线程的出现,你必须学习并考虑到许多与线程相关的事情。如果你不知道自己在做什么,就有很多潜在的细微错误。因此我建议第一步采用替代方法,即单线程。作为奖励,这将使以后更容易转向多线程解决方案

  • 创建QObject的普通子类。在此QObject中,将计算状态作为成员变量

  • 在上面的类中编写一个slot方法,该方法执行一小段计算,然后返回。为了获得良好的用户体验,它最多应该执行50毫秒左右的操作。您可以在循环中使用固定的迭代次数,或者使用
    qelasedtimer
    来测量时间,或者其他任何方法。然后,再次调用该方法时,该方法应该可以再继续计算50毫秒。当计算完成时,该方法可以发出一个带有结果的信号

  • 添加一个间隔为0的
    QTimer
    。将超时连接到上面描述的slot方法。这里的间隔0实际上意味着,Qt将尽可能频繁地调用该方法。您希望这样做,因为您当然希望计算尽快完成。但是,由于该方法很快返回,因此Qt可以执行其他操作(更新GUI等),然后再次调用方法


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

    您有两个选择。更有效的选择是将计算转换到另一个线程(或多个线程,现代PC中很少有单核CPU)。有一些链接供您参考

    然而,随着线程的出现,你必须学习并考虑到许多与线程相关的事情。如果你不知道自己在做什么,就有很多潜在的细微错误。因此我建议第一步采用替代方法,即单线程。作为奖励,这将使以后更容易转向多线程解决方案

  • 创建QObject的普通子类。在此QObject中,将计算状态作为成员变量

  • 在上面的类中编写一个slot方法,该方法执行一小段计算,然后返回。为了获得良好的用户体验,它最多应该执行50毫秒左右的操作。您可以在循环中使用固定的迭代次数,或者使用
    qelasedtimer
    来测量时间,或者其他任何方法。然后,再次调用该方法时,该方法应该可以再继续计算50毫秒。当计算完成时,该方法可以发出一个带有结果的信号

  • 添加一个间隔为0的
    QTimer
    。将超时连接到上面描述的slot方法。这里的间隔0实际上意味着,Qt将尽可能频繁地调用该方法。您希望这样做,因为您当然希望计算尽快完成。但是,由于该方法很快返回,因此Qt可以执行其他操作(更新GUI等),然后再次调用方法


  • 一旦这在单线程中起作用,您就可以学习使用Qt线程,并将worker对象移动到另一个线程中,以提高性能。此外,您还可以与单线程基线版本进行比较,以防遇到线程问题。

    如果我们可以检查您的代码,那将非常好。您可能是e正在分配兆字节的内存,或者该值太大。抱歉,这是不可能的,因为代码太长。是否有可能停止此消息+行为?请看一看,您可能会将其翻译为“无响应”。至于您的问题,可能是因为您在特定的时间步长内执行了太多的命令。您可能希望将问题分块,并在其间进行短暂暂停,可能是使用状态输出或类似的方式。您需要使此暂停具有一定的逻辑性,以保持其有机性。您必须将计算移动到单独的区域d、 所以你不会阻止GUI线程,这将是gre