我正在开发一个 PyQt6 应用程序,该应用程序可以绘制来自测量仪器的数据以及与用户输入相关的其他内容,当我在 Windows 上运行它与在同一台计算机的 WSL(Linux 的 Windows 子系统)上运行它时,我遇到了明显的滞后!以下是我在那里使用的 Qt 对象的一些详细信息:
matplotlib.backends.backend_qtagg.FigureCanvas
绘制数据。QtCore.QTimer
和尽可能最小的 1ms
间隔(根据 docs)从测量仪器获取数据并用它更新绘图。QTimer
来更新所有这些数据。是否是
QTimer
的用法不适合这个用例?也许我应该使用QThread
?或者每个通道一个 QThread
?我也在考虑要不要换成pyqtgraph
....
我将把上面的任何变化应用到我的代码中,它将提高它在所有平台上的性能,所以无论哪种方式,了解为什么在 Windows 上本地运行它要慢得多,这将是非常有趣的.
在计时器的超时函数中添加
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()
另请参阅: