C++ Qt C++&引用;keine Rü;ckmeldung";-长时间计算期间GUI中出现错误
我有一个关于长时间计算的问题: 在执行GUI的某些任务时,可能会进行长时间的计算。这不是问题,只是需要一段时间——一切正常(至少结果良好) 困扰我的是,经过一段时间后,我的GUI似乎没有响应:例如,在计算过程中显示的myC++ Qt C++&引用;keine Rü;ckmeldung";-长时间计算期间GUI中出现错误,c++,qt,user-interface,responsiveness,C++,Qt,User Interface,Responsiveness,我有一个关于长时间计算的问题: 在执行GUI的某些任务时,可能会进行长时间的计算。这不是问题,只是需要一段时间——一切正常(至少结果良好) 困扰我的是,经过一段时间后,我的GUI似乎没有响应:例如,在计算过程中显示的myProcessBar将不会显示,并且在我的GUI的标题栏中添加了文本“keine Rückmeldung”(这意味着忙碌、崩溃等-抱歉,我不知道正确的翻译,这使得我很难在互联网上找到关于这个问题的任何信息) 有可能停止这种行为吗? 谢谢。您应该将昂贵、持久的计算从GUI线程外包给
ProcessBar
将不会显示,并且在我的GUI的标题栏中添加了文本“keine Rückmeldung”(这意味着忙碌、崩溃等-抱歉,我不知道正确的翻译,这使得我很难在互联网上找到关于这个问题的任何信息)
有可能停止这种行为吗?
谢谢。您应该将昂贵、持久的计算从GUI线程外包给工作线程,以防止GUI冻结 Qt文档: 我发现QThread用法的良好解释非常有用:
无法从工作线程更改GUI本身。您必须向主线程报告数据更改,并从主线程更新GUI。您应该将昂贵、持久的计算从GUI线程外包给工作线程,以防止GUI冻结 Qt文档: 我发现QThread用法的良好解释非常有用:
GUI本身不能从工作线程更改。您必须向主线程报告数据更改,并从主线程更新GUI。您有两个选择。更有效的选择是将您的计算放入另一个线程(或多个线程,现代PC中很少有单核CPU)。有一些链接供您选择 然而,随着线程的出现,你必须学习并考虑到许多与线程相关的事情。如果你不知道自己在做什么,就有很多潜在的细微错误。因此我建议第一步采用替代方法,即单线程。作为奖励,这将使以后更容易转向多线程解决方案
qelasedtimer
来测量时间,或者其他任何方法。然后,再次调用该方法时,该方法应该可以再继续计算50毫秒。当计算完成时,该方法可以发出一个带有结果的信号QTimer
。将超时连接到上面描述的slot方法。这里的间隔0实际上意味着,Qt将尽可能频繁地调用该方法。您希望这样做,因为您当然希望计算尽快完成。但是,由于该方法很快返回,因此Qt可以执行其他操作(更新GUI等),然后再次调用方法一旦这在单线程中起作用,您就可以学习使用Qt线程,并将worker对象移动到另一个线程中,以提高性能。此外,如果遇到线程问题,您还可以与单线程基线版本进行比较。您有两个选择。更有效的选择是将计算转换到另一个线程(或多个线程,现代PC中很少有单核CPU)。有一些链接供您参考 然而,随着线程的出现,你必须学习并考虑到许多与线程相关的事情。如果你不知道自己在做什么,就有很多潜在的细微错误。因此我建议第一步采用替代方法,即单线程。作为奖励,这将使以后更容易转向多线程解决方案
qelasedtimer
来测量时间,或者其他任何方法。然后,再次调用该方法时,该方法应该可以再继续计算50毫秒。当计算完成时,该方法可以发出一个带有结果的信号QTimer
。将超时连接到上面描述的slot方法。这里的间隔0实际上意味着,Qt将尽可能频繁地调用该方法。您希望这样做,因为您当然希望计算尽快完成。但是,由于该方法很快返回,因此Qt可以执行其他操作(更新GUI等),然后再次调用方法一旦这在单线程中起作用,您就可以学习使用Qt线程,并将worker对象移动到另一个线程中,以提高性能。此外,您还可以与单线程基线版本进行比较,以防遇到线程问题。如果我们可以检查您的代码,那将非常好。您可能是e正在分配兆字节的内存,或者该值太大。抱歉,这是不可能的,因为代码太长。是否有可能停止此消息+行为?请看一看,您可能会将其翻译为“无响应”。至于您的问题,可能是因为您在特定的时间步长内执行了太多的命令。您可能希望将问题分块,并在其间进行短暂暂停,可能是使用状态输出或类似的方式。您需要使此暂停具有一定的逻辑性,以保持其有机性。您必须将计算移动到单独的区域d、 所以你不会阻止GUI线程,这将是gre