完成后如何自动退出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
我希望在 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