Как выйти из PyQT QThread автоматически, когда это будет сделано? - PullRequest
0 голосов
/ 08 ноября 2019

Я хочу, чтобы звук воспроизводился при нажатии кнопки в PyQT5.

Воспроизведение звука представляется блокирующей операцией, поэтому графический интерфейс не отвечает. Поэтому я хочу начать новый поток, воспроизвести звук и удалить поток, все неблокирующим образом.

Я создаю класс потока

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, но эта операция, кажется, блокирует, побеждая точку.

Как правильно выйти из потока после завершения неблокирующим способом?

1 Ответ

1 голос
/ 08 ноября 2019

Почему оно должно быть удалено? Я не вижу никакого вызова "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
...