【问题标题】:PYQTGraph application slows down when mouse moves over application当鼠标移到应用程序上时,PYQTGraph 应用程序变慢
【发布时间】:2014-06-27 09:03:30
【问题描述】:

我有一个多线程(通过 pyqt)应用程序,它绘制实时数据(数据在第二个线程中处理并传递给 gui 线程以通过 pyqt 信号进行绘制)。如果我将鼠标放在应用程序上,它会继续全速运行(通过调用app.processEvents() 之间的时间差来衡量)。当我开始移动鼠标时,更新速度会变慢,当我停止移动鼠标时会再次增加。

有谁知道我可以如何解决/调试问题?

代码很长很复杂,所以我不想在这里发布。谢谢!

【问题讨论】:

  • 可能看起来很明显,但是您是否检查过是否有任何 mouseMoveEvent 事件处理程序处于活动状态?
  • 我没有明确定义。我将如何寻找任何默认值?
  • 我想看看你的代码会很好。在您的代码中调用 processEvents 并不理想,因此这可能是您的问题的一部分

标签: python qt pyqt pyqtgraph


【解决方案1】:

场景中可能有项目接受自己的鼠标输入,但如果不看代码就很难说。特别是,要警惕可点击的复杂绘图线——计算鼠标光标与如此复杂形状的交点非常昂贵。

解决性能问题的最佳(有些人只会说)方法是分析您的应用程序:在不移动鼠标的情况下运行 python -m cProfile -s cumulative your_script.py 一次,然后在移动鼠标时再次运行(确保花费大量时间移动鼠标),然后比较输出以查看解释器将所有时间花在哪里。

【讨论】:

  • 谢谢,我可以在分析代码中看到来自 GraphicsView.py 和 GraphicsScene.py 的 mouseMoveEvent 调用(在 和 {build-in method exec_ 之后的累积配置文件中的第 3 和第 4 }. 我有一个 GraphicsLayoutWidget 对象使用 addPlot 创建绘图。但我无法立即看到调用 mouseMoveEvent 的内容。
  • 在整理我的 python 脚本的精简编码来演示问题时,我发现它是由第二个数据线程 run() 调用引起的。我不知道为什么当鼠标移动时这会减慢整个程序的速度,或者为什么它会触发mouseMoveEvent。无论如何我都会在下面发布粘液代码
  • 我们应该找到一个不同的地方来讨论该代码,但我会给出一些提示:1)您的线程消耗了大量的 CPU 并不断挂起 GIL。在这种情况下,您应该预期性能会下降。2)仅仅因为代码被定义为 QThread 的方法并不意味着代码必须在另一个线程中运行。在您的情况下,第二个线程除了浪费 CPU 周期外什么也不做——数据生成实际上发生在主线程中。
  • 感谢您花时间看这个;我已经从 QThread 定义转移到 QObject,moveToThread 代码结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多