多线程 – PyQt5 Python 3:传递列表,dicts作为跨线程的信号参数

我使用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 receive_data(self, data):
        print("received data", data)
        data[1] = 42
        print("modified data", data)

def main():
    app = QApplication(sys.argv)
    processing_thread = ClassProcessingThread()
    some_class = SomeClass()
    processing_thread.processing.py_sig_send_data.
        connect(some_class.receive_data)
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

输出:

[1, 2, 3, 4, 5]
received data [1, 2, 3, 4, 5]
modified data [1, 42, 3, 4, 5]
modified data in thread [1, 42, 3, 4, 5]

有人可以向我解释如何以线程安全的方式传递pyqtSignal中的列表.谢谢.

最佳答案 当使用信号在线程之间传递容器类型时,PyQt的行为与Qt的行为不同.

具体来说,没有自动转换[1]到等效的Qt类型,因此没有隐式复制.但是,PyQt确实提供了一种明确请求此类转换的机制.为此,您可以使用QVariantList或QVariantMap定义自定义信号:

    py_sig_send_data = pyqtSignal('QVariantList')

但是,重要的是要注意QVariantMap仅支持字符串键.

总而言之,在通过线程传递信号之前,只是明确地复制可变的python类型可能更简单,更清晰,更安全.

[1]或至少,not any more.

点赞