Python 从QAbstractListModel更新QListView时CPU过载
我正在构建一个小pyqt5应用程序,它在QListView中显示512个值的列表。列表通过单独的线程(使用QThread)进行更新。 它工作得很好,除了它使用了我正在开发的(旧的)内核2 Duo 2,53 Ghz的65/95%的CPU 我简化了代码以消除依赖性,因为更新是通过网络协议完成的。每秒更新40次(每次25毫秒) 下面的简化脚本每秒刷新列表10次,更新列表时CPU仍为65% 有什么办法避免超载吗? 更新视图是否有一些最佳实践可遵循 (我的上一段代码中没有全局变量,这里有一个简单的示例)Python 从QAbstractListModel更新QListView时CPU过载,python,python-2.7,model-view-controller,pyqt5,Python,Python 2.7,Model View Controller,Pyqt5,我正在构建一个小pyqt5应用程序,它在QListView中显示512个值的列表。列表通过单独的线程(使用QThread)进行更新。 它工作得很好,除了它使用了我正在开发的(旧的)内核2 Duo 2,53 Ghz的65/95%的CPU 我简化了代码以消除依赖性,因为更新是通过网络协议完成的。每秒更新40次(每次25毫秒) 下面的简化脚本每秒刷新列表10次,更新列表时CPU仍为65% 有什么办法避免超载吗? 更新视图是否有一些最佳实践可遵循 (我的上一段代码中没有全局变量,这里有一个简单的示例)
这似乎是正常的行为…这个例子真的真实吗?数据总是那么频繁地变化吗?对于您的问题,最明显的答案似乎是:仅在您真正需要时更新。它是artnet DMX协议的基本查看器。帧每秒发送40次。我知道显示所有值可能没有用,但如何限制更新?如果这是一个非常明显的问题,很抱歉,但我在pyqtsignal或QabStretctModel参考页上都没有看到任何信息。@ekhumoro:您认为当每秒钟更新QlistView 10次时,这种CPU负载是正常的吗?如果值经常更改,在列表视图中显示这些值的目的是什么?人类的反应时间最多只有五分之一秒,因此用户无法以任何有意义的方式与视图交互。将值作为一个文本块转储似乎要简单得多,但是,考虑到我前面提到的要点,因此频繁更新列表是没有意义的。你看不到这里明显的比赛情况吗?在用户单击某个项目所需的时间内,该值可能会发生多次更改!为了使界面可用,您应该每两秒钟更新一次,并在列表更新时阻止与列表的交互。
from random import randrange
from time import sleep
from sys import argv, exit
from PyQt5.QtCore import QThread, QAbstractListModel, Qt, QVariant, pyqtSignal
from PyQt5.QtWidgets import QListView, QApplication, QGroupBox, QVBoxLayout, QPushButton
universe_1 = [0 for i in range(512)]
class SpecialProcess(QThread):
universeChanged = pyqtSignal()
def __init__(self):
super(SpecialProcess, self).__init__()
self.start()
def run(self):
global universe_1
universe_1 = ([randrange(0, 101, 2) for i in range(512)])
self.universeChanged.emit()
sleep(0.1)
self.run()
class Universe(QAbstractListModel):
def __init__(self, parent=None):
super(Universe, self).__init__(parent)
def rowCount(self, index):
return len(universe_1)
def data(self, index, role=Qt.DisplayRole):
index = index.row()
if role == Qt.DisplayRole:
try:
return universe_1[index]
except IndexError:
return QVariant()
return QVariant()
class Viewer(QGroupBox):
def __init__(self):
super(Viewer, self).__init__()
list_view = QListView()
self.list_view = list_view
# create a vertical layout
vbox = QVBoxLayout()
universe = Universe()
vbox.addWidget(list_view)
# Model and View setup
self.model = Universe(self)
self.list_view.setModel(self.model)
# meke a process running in parallel
my_process = SpecialProcess()
my_process.universeChanged.connect(self.model.layoutChanged.emit)
# set the layout on the groupbox
vbox.addStretch(1)
self.setLayout(vbox)
if __name__ == "__main__":
app = QApplication(argv)
group_widget = Viewer()
group_widget.show()
exit(app.exec_())