如何调试大型 Qt 应用程序中的瓶颈?

问题描述 投票:0回答:1

最近,我在一个非常大的 Qt 应用程序中调试一些东西。问题是我的应用程序有时会卡住(滞后)。我尝试了很多方法和不同的方法来找出哪个阻塞了 GUI 线程。

  1. 我禁用了应用程序的很多部分来寻找瓶颈,所以我找到了一部分。
  2. 仅禁用了该部分,但问题是该部分只执行了 2-3 秒,然后就完成了,但我也有很长一段时间的滞后,当我禁用它时,我已经没有了。很奇怪。
  3. 所以我用了很多分析器;最后一款对我来说更好,Intelvtune 放大器。但它对我帮助不大。

所以我认为现在对我来说最好的解决方案是观察事件循环中排队的任务,看看哪些任务消耗超过 30 毫秒,但我不知道如何查看事件循环中正在调用什么(内部的)。您有什么建议或解决方案吗? 谢谢。 

c++ qt qwidget qeventloop
1个回答
0
投票

很难根据您提供的信息判断这是否是您的问题,但需要检查一些事项:

  1. 如果您的代码中的线程中有任何

    waitForXxx()
    调用,且该线程不应该停止,请删除它们。相反,将适当的(实际上是所有的,即使你只是在那里进行调试打印,当事情没有按你预期的那样工作时,这会让你的生活变得更加轻松)信号连接到插槽或 lambda(记住设置上下文,通常是
     this
    ,在 lambda 连接中)。

  2. 如果你在代码中调用

    processEvents()
    ,尤其是GUI线程,看看是否可以摆脱它。如果您正在循环中等待某些内容,请使其在完成时收到信号,并且不会让事件循环阻塞循环。如果您进行繁重的处理并调用
    processEvents()
    来防止应用程序冻结,请将繁重的处理移至不同的线程,并在完成时再次发出信号,或类似的操作。

  3. 如果您调用外部API,例如C++标准库或系统调用,它们会阻塞IO或可能会阻塞,那么请摆脱阻塞模式。例如,仅写入尽可能多的数据,并读取尽可能多的可用数据,如果未完成,则等待指示继续(或者最坏的情况,使用计时器稍后重试)。

© www.soinside.com 2019 - 2024. All rights reserved.