小编Joh*_*ohn的帖子

PyQt5 + Python 3:跨线程传递列表、字典作为信号参数

我正在使用 pyqtSignal 将 python 列表作为参数从工作线程发送到主线程。qt 何时创建作为参数传递的对象的副本。根据:http://www.embeddeduse.com/2013/06/29/copied-or-not-copied-arguments-signals-slots/ qt 应该复制该对象。但是,在下面的示例中,主线程可以更改从另一个线程发送的列表的内容。

import sys
import time
from PyQt5.QtCore import QThread, QObject, pyqtSlot, pyqtSignal
from PyQt5.QtWidgets import QApplication

class ClassProcessing(QObject):

    py_sig_send_data = pyqtSignal(list)

    def __init__(self):
        super().__init__()
        # initialize some variables
        self.data = [1, 2, 3, 4, 5]

    def worker(self):
        print(self.data)
        self.py_sig_send_data.emit(self.data)
        time.sleep(1)
        print("modfied data in thread", self.data)

class ClassProcessingThread(QObject):
    def __init__(self):
        super().__init__()
        self.objThread = QThread()
        self.objThread_id = 1
        self.objThread_finished = False
        self.processing = ClassProcessing()
        self.processing.moveToThread(self.objThread)
        self.objThread.started.connect(self.processing.worker)
        self.objThread.start()

class SomeClass(QObject):
    def __init__(self):
        super().__init__()

    @pyqtSlot(list)
    def …
Run Code Online (Sandbox Code Playgroud)

multithreading thread-safety signals-slots python-3.x pyqt5

5
推荐指数
1
解决办法
4069
查看次数