首页 > 解决方案 > Python。从 Worker 发送信号

问题描述

我正在一个 Python 应用程序中工作,在 Raspberry Pi 上使用 PySide,并带有 Raspbian Jessie OS。

我是 Python 的新手,而且我根本不是专家。所以可能这是一个初学者的问题。

在我的应用程序中,我有:

在 subyacent 线程代码的某些地方,我需要发出一个必须由主线程捕获的信号。在以前的版本中,我是这样做的:

主线程代码

    #Slot for clicked button
    def Slot_Start_Calculation (self):

        self.MyLongThread = QThread()
        MyLongWorker = MyWorker(self, Qty)
        MyLongWorker.moveToThread(self.MyLongThread)

        self.MyLongThread.started.connect(MyLongWorker.Run_LongWorker)
        MyLongWorker.WorkerFinished.connect(self.MyLongThread.quit)
        MyLongWorker.WorkerFinished.connect(self.MyLongWorker.deleteLater)
        MyLongThread.finished.connect(self.MyLongThread.deleteLater)

        MyLongThread.start()


    def Slot_Worker_Sent_A_Signal (self, Result):

        print ("Worker sent this result: " + str(Result))
        .
        .
        .

MyWorker 的代码

class MyWorker(QObject):

    WorkerFinished = Signal()
    CustomSignal = Signal(int)

    def __init__(self, parent, Quantity)

        super().__init__(parent)
        self_parent = parent
        self.Quantity = Quantity
        print("Myworker's constructor")

    def __del__(self):
        print("Myworker's destructor")


    def Run_LongWorker (self):

        self.CustomSignal.connect(self.parent.Slot_Worker_Sent_A_Signal)
        .
        .
        .
        self.CustomSignal.emit(MyPartialResult)
        .
        .
        .
        self.WorkerFinished.emit()

几周前,当我完成 GUI 的一些细节时,这段代码在测试环境中运行,我没有发现任何错误。昨天在网上搜索我偶然注意到 QObject::moveToThread 不能移动带有父对象的对象

https:[//forum.qt.io/topic/40653/qobject-movetothread-cannot-move-objects-with-a-parent][1]

所以我担心我的代码可能存在我尚未检测到的问题。

我修改了这部分代码,现在是:

主线程的新代码

    #New slot for clicked button.
    def Slot_Start_Calculation (self):

        MyLongThread = QThread()
        MyLongWorker = MyWorker(Qty)
        MyLongWorker.moveToThread(MyLongThread)

        MyLongThread.started.connect(MyLongWorker.Run_LongWorker)
        MyLongWorker.WorkerFinished.connect(MyLongThread.quit)
        MyLongWorker.WorkerFinished.connect(MyLongWorker.deleteLater)
        MyLongThread.finished.connect(MyLongThread.deleteLater)

        MyLongThread.start()


    def Slot_Worker_Sent_A_Signal (self, Result):

        print ("Worker sent this result: " + str(Result))
        .
        .
        .

MyWorker 的新代码

class MyWorker(QObject):

    WorkerFinished = Signal()
    CustomSignal = Signal(int)

    def __init__(self, Quantity)

        super().__init__()
        self.Quantity = Quantity
        print("Myworker's constructor")

    def __del__(self):
        print("Myworker's destructor")

    def Run_LongWorker (self):

        self.CustomSignal.connect( ??? .Slot_Worker_Sends_A_Signal)
        .
        .
        .
        self.CustomSignal.emit(MyPartialResult)
        .
        .
        .
        self.WorkerFinished.emit()

所以,现在,我真的不知道如何将此信号连接到位于主线程中的插槽,因为如果我没记错的话,由于我更改了线程亲和力,因此没有父/子关系。

有人可以告诉我是否有办法做到这一点,并指导我获取有关此问题的文档吗?

提前谢谢了。

标签: pythonmultithreading

解决方案


最后,我想我找到了答案。在 Worker 类的构造函数中,我不得不更改父对象引用和超类 init 调用。

class MyWorker(QObject):

    WorkerFinished = Signal()
    CustomSignal = Signal(int)

    def __init__(self, parent = None, Quantity)
        super().__init__()
        self.Quantity = Quantity
        print("Myworker's constructor")

    def __del__(self):
        print("Myworker's destructor")


    def Run_LongWorker (self):

        .
        .
        .
        self.CustomSignal.emit(MyPartialResult)
        .
        .
        .
        self.WorkerFinished.emit()

现在一切都按预期工作。

如果有人发现该代码有问题,请随时告诉我。

谢谢!


推荐阅读