完成后如何自动退出PyQT QThread?

How to quit PyQT QThread automatically when it is done?

我希望在 PyQT5 中单击按钮时播放声音。

播放声音似乎是一个阻塞操作,因此 GUI 没有响应。因此,我想以非阻塞方式启动一个新线程、播放声音和删除线程。

我创建了一个线程class

class playSoundThread(QtCore.QThread):
    def __init__(self, soundpath):
        QtCore.QThread.__init__(self)
        self.soundpath = soundpath

    def __del__(self):
        self.wait()
        print("Thread exited")

    def run(self):
        playsound(self.soundpath)

而运行如下

class MainClass(...):
    ...

    def playsound(self, soundKey):
        self.thisSoundThread = playSoundThread(self.sounds[soundKey])
        self.thisSoundThread.start()

一切正常并且没有阻塞。唯一的问题是当声音停止播放时线程不会被删除。我试过调用del self.thisSoundThread,但这个操作似乎是阻塞的,打败了重点。

以非阻塞方式完成后退出线程的正确方法是什么?

为什么要删除它?我没有看到 "del" 的任何调用,并且您将其分配给实例,因此 GC 也没有看到,因为仍然存在引用。

如果你想删除它,你必须这样做:

class MainClass(...):
    ...

    def playsound(self, soundKey):
        self.thisSoundThread = playSoundThread(self.sounds[soundKey])
        self.thisSoundThread.finished.connect(self.threadfinished)
        self.thisSoundThread.start()

    def threadfinished(self)
        del self.thisSoundThread
        # or set it to None