Python 作为QThread运行繁重的QTimer任务

Python 作为QThread运行繁重的QTimer任务,python,pyside2,qthread,qtimer,Python,Pyside2,Qthread,Qtimer,我有一项繁重的任务,每500米跑一次。它包括更新GUI元素,我需要随时访问它的变量 执行的任务:一个动态更新的列表,每隔500毫秒,一个循环遍历该列表,并在其中包含的元素上执行任务。有时我没有任何元素,有时我有很多元素 加载列表时,用户开始遇到鼠标移动、按键等延迟。毫无疑问,这是因为每500毫秒执行一次繁重的任务 有没有一种方法可以让我将这个QTimer任务放到QThread中,并不断地访问它的元素,以便更新其中包含的列表 换句话说,我希望它在任何时候都在后台运行,但也能够在任何给定时刻更新其中

我有一项繁重的任务,每500米跑一次。它包括更新GUI元素,我需要随时访问它的变量

执行的任务:一个动态更新的列表,每隔500毫秒,一个循环遍历该列表,并在其中包含的元素上执行任务。有时我没有任何元素,有时我有很多元素

加载列表时,用户开始遇到鼠标移动、按键等延迟。毫无疑问,这是因为每500毫秒执行一次繁重的任务

有没有一种方法可以让我将这个QTimer任务放到QThread中,并不断地访问它的元素,以便更新其中包含的列表

换句话说,我希望它在任何时候都在后台运行,但也能够在任何给定时刻更新其中使用的列表

我正在使用PySide2;我见过一些例子,但没有一个符合我的目标

例如: 如我所愿,我想从主线程更新“aList”元素。如果列表为空,则for循环不会执行任何操作。否则,它将在元素上循环并向其添加1

“运行”功能上应设置500毫秒的Qtimer

有时列表可能是空的,有时充满了元素。它的大小由GUI线程控制

 from PySide2 import QtCore
 from PySide2 import QtGui 
 from PySide2 import QtWidgets

 import sys
 import time

 class RxProcess(QtCore.QThread):

     output = QtCore.Signal()

     def __init__(self, parent = None):
         super(RxProcess, self).__init__(parent)
         self.aList = list()

    
     def run(self):
    
         # Loop through list
         for element in self.aList: 
        
             element += 1

             # Print to the gui the element that was just updated in the list
             self.output.emit(element)

使用QThread很难实现该逻辑(必须使用QThread.msleep、mutex等)。相反,一个简单的解决方案是每T秒创建一个新线程,该线程将使用threading.thread+QTimer实现(也可以使用QThreadPool+QRunnable+QTimer实现):

随机导入
导入系统
导入线程
导入时间
从PySide2导入QtCore、QtWidgets
进口香菇2
类工作者(QtCore.QObject):
输出=QtCore.信号(对象)
def long_running_函数(值、工作者):
对于值中的元素:
睡眠时间(0.1)
如果shiboken2.isValid(工作者):
worker.output.emit(元素)
类小部件(qtwidts.QWidget):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.label=qtwidts.QLabel(alignment=QtCore.Qt.AlignCenter)
self.button=qtwidts.QPushButton(“开始”)
lay=qtwidts.QVBoxLayout(self)
lay.addWidget(self.button)
lay.addWidget(self.label)
self.timer=QtCore.QTimer(间隔=500)
self.button.clicked.connect(self.handle_clicked)
self.timer.timeout.connect(self.launch_任务)
已单击def句柄(自身):
如果self.button.text()=“开始”:
self.timer.start()
self.button.setText(“停止”)
elif self.button.text()=“停止”:
self.timer.stop()
self.button.setText(“开始”)
def启动_任务(自我):
值=随机样本(范围(1,50,20)
工人=工人()
worker.output.connect(self.label.setNum)
穿线,穿线(
目标=长时间运行功能,
args=(值,工作者),
daemon=True,
).start()
如果名称=“\uuuuu main\uuuuuuuu”:
app=qtwidts.QApplication(sys.argv)
w=Widget()
w、 show()
sys.exit(app.exec_())

我将尝试一下这个解决方案。快速问题:我是否可以将类内对象作为参数发送到线程?那个“shiboken.isValid()”函数到底是用来做什么的?真是太神奇了!!非常感谢!