gpt4 book ai didi

python - worker 完成后不会发出 QThread.finished 信号

转载 作者:行者123 更新时间:2023-12-05 01:51:32 25 4
gpt4 key购买 nike

我有以下代码:

import time

from PyQt5.QtCore import QThread, QObject
from PyQt5.QtWidgets import QWidget, QApplication


class Worker(QObject):

def run(self):
time.sleep(1)
print("Worker is finished")


class MainWindow(QWidget):

def __init__(self):
super().__init__()
self.show()

self.thread = QThread()
self.worker = Worker()
self.worker.moveToThread(self.thread)
self.thread.started.connect(self.worker.run)
self.thread.finished.connect(self.on_thread_finished)
self.thread.start()

def on_thread_finished(self):
print("Thread finished")
self.thread.deleteLater()


if __name__ == "__main__":
app = QApplication([])
window = MainWindow()
app.exec_()

运行它,它显示窗口,打印Worker is finished,仅此而已。这很奇怪。恕我直言,当 worker 完成时,线程也应该完成,这意味着应该调用 on_thread_finished 方法并打印 Thread finished。但事实并非如此。为什么?

最佳答案

当您使用 moveToThread 而不是重新实现 QThread.run 时, 线程将启动自己的事件循环,该循环将等待直到显式调用 exit/quitfinished 信号仅在事件循环停止后(和/或一旦 run 返回)才会发出。处理这种情况的通常方法是从 worker 发出自定义信号,并将其连接到线程的 quit 插槽。 (注意:跨线程信号槽连接保证是线程安全的)。

因此,您的示例将按预期工作并进行以下更改:

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

def run(self):
time.sleep(1)
print("Worker is finished")
self.finished.emit()


class MainWindow(QWidget):
def __init__(self):
...
self.worker.moveToThread(self.thread)
self.worker.finished.connect(self.thread.quit)

关于python - worker 完成后不会发出 QThread.finished 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72216161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com