带有 QTimer 的 PyQt6 应用程序在 Windows 上比同一台机器的 WSL 慢得多

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

我正在开发一个 PyQt6 应用程序,该应用程序可以绘制来自测量仪器的数据以及与用户输入相关的其他内容,当我在 Windows 上运行它与在同一台计算机的 WSL(Linux 的 Windows 子系统)上运行它时,我遇到了明显的滞后!以下是我在那里使用的 Qt 对象的一些详细信息:

  • 我使用
    matplotlib.backends.backend_qtagg.FigureCanvas
    绘制数据。
  • 我使用
    QtCore.QTimer
    和尽可能最小的
    1ms
    间隔(根据 docs)从测量仪器获取数据并用它更新绘图。
  • 我正在绘制来自仪器多个通道的测量数据,目前使用单个
    QTimer
    来更新所有这些数据。

是否是

QTimer
的用法不适合这个用例?也许我应该使用
QThread
?或者每个通道一个
QThread
?我也在考虑要不要换成
pyqtgraph
....

我将把上面的任何变化应用到我的代码中,它将提高它在所有平台上的性能,所以无论哪种方式,了解为什么在 Windows 上本地运行它要慢得多,这将是非常有趣的.

matplotlib pyqt platform qtimer
1个回答
0
投票

在计时器的超时函数中添加

print
语句,将显示 GUI 并未完全卡住,因为即使 GUI 似乎卡住了,超时功能也会继续打印。这表明 Qt 事件循环无法处理计时器超时函数调用之间的事件。

在不同的平台上,事件循环的实现方式不同,CPU/系统负载也可能会产生影响,因此在这种低间隔定时器中,手动处理事件是安全的。这是一个最小的工作示例:

import time

from PyQt6 import (
    QtWidgets,
    QtCore,
)

class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self._main = QtWidgets.QLabel()
        self.setCentralWidget(self._main)
        self._timer = QtCore.QTimer()
        self._timer.timeout.connect(self.updateTimerLabel)
        self._timer.start()

    def updateTimerLabel(self):
        self._main.setText("Time now is {}".format(time.time()))
        # This is the important part!
        qapp.processEvents()


qapp = QtWidgets.QApplication([])
app = ApplicationWindow()
app.show()
app.activateWindow()
app.raise_()
qapp.exec()

另请参阅:

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