python3多线程传参_多线程 – 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类型可能更简单,更清晰,更安全.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值