完成后将 QRunnable 连接到函数/方法

Posted

技术标签:

【中文标题】完成后将 QRunnable 连接到函数/方法【英文标题】:Connect QRunnable to a function/method when finished 【发布时间】:2019-06-28 18:30:03 【问题描述】:

QThread 有一个完成的信号,我可以在线程完成时做一些事情(连接到方法/函数),但是我也想用 QRunnable 来做这件事。有没有办法在完成后将 QRunnable 线程连接到方法/函数?

Q线程:

class HelloWorldTask(QThread):
    def __init__(self):
        QThread.__init__(self)
    def run(self):
        import time
        time.sleep(3)
        print ("Running thread \n")
        time.sleep(3)

hello.finished.connect(check)

def check():
    print('Thread Done')

输出:

运行线程

完成

QRunnable:

instance = QThreadPool.globalInstance()


class HelloWorldTask(QRunnable):
    def __init__(self):
        super().__init__(self)
    def run(self):
        import time
        time.sleep(3)
        print ("Running thread \n")
        time.sleep(3)

hello = HelloWorldTask()
#hello.finished.connect(check) <-- how to connect to a method/function when finished.
instance.start(hello)
print(instance.waitForDone())

def check():
    print('Thread Done')

想要的输出:

运行线程

线程完成

【问题讨论】:

【参考方案1】:

QRunnable 没有完成信号,因为它不是 QObject,因此可能的解决方案是创建另一个继承自 QObject 的类,以便它发出信号:

from PyQt5 import QtCore


class Signals(QtCore.QObject):
    finished = QtCore.pyqtSignal()


class HelloWorldTask(QtCore.QRunnable):
    def __init__(self):
        super().__init__()
        self.signal = Signals()

    def run(self):
        import time

        time.sleep(3)
        print("Running thread \n")
        time.sleep(3)
        self.signal.finished.emit()


def check():
    print("Thread Done")
    QtCore.QCoreApplication.quit()


if __name__ == "__main__":
    import sys

    app = QtCore.QCoreApplication(sys.argv)
    hello = HelloWorldTask()
    hello.signal.finished.connect(check)
    QtCore.QThreadPool.globalInstance().start(hello)
    sys.exit(app.exec_())

【讨论】:

以上是关于完成后将 QRunnable 连接到函数/方法的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在工作后将线程连接到“并行”区域?

停止 QRunnable 导致主窗口无法关闭

导出异步等待变量并在 JS 中完成“等待”后将其导入另一个文件

actioncable 无法连接到 websocket

使用 GWT 连接到 SQL Server

如何杀死 PyQt5 中的 QRunnable?