python - Python。从 Worker 发送信号
问题描述
我正在一个 Python 应用程序中工作,在 Raspberry Pi 上使用 PySide,并带有 Raspbian Jessie OS。
我是 Python 的新手,而且我根本不是专家。所以可能这是一个初学者的问题。
在我的应用程序中,我有:
- 主线程 -> 实现前端的 Gui 线程。
- subyacent 线程 -> 进行一些长时间的工作(根本没有 gui,纯代码),在名为 MyWorker 的自定义类中实现。
在 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()
所以,现在,我真的不知道如何将此信号连接到位于主线程中的插槽,因为如果我没记错的话,由于我更改了线程亲和力,因此没有父/子关系。
有人可以告诉我是否有办法做到这一点,并指导我获取有关此问题的文档吗?
提前谢谢了。
解决方案
最后,我想我找到了答案。在 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()
现在一切都按预期工作。
如果有人发现该代码有问题,请随时告诉我。
谢谢!
推荐阅读
- node.js - 使用 parse: false in Hapi multipart/form-data 时,流似乎只有 1 个块
- android-studio - Android工作室:无法从gitlab找到包
- angular - Observable 永远不会在 Resolver 中完成
- python - 如何使用 xESMF 将高分辨率 GRIB 网格重新采样为更粗略的分辨率?
- lua - 如何使用 Freeswitch 和 Jitsi 设置 SIP 电话会议
- c++ - 如何从自身递归继承模板类?(不是 CRTP!)
- r - 'relevel' 仅适用于(无序)因子
- c - fscanf 返回一个字符串的值
- entity-framework - Asp.Net Core Identity 创建用户
- php - Laravel 功能测试总是返回 404