Python 在PyQT4中读取并发音频文件
我正在开发一个GUI应用程序,它可以播放音乐文件(由用户选择),同时播放这些音乐文件后面的背景声音,,同时保持一个响应良好的GUI主窗口。我试图使用多个线程来迭代for循环,调用列表中的每个文件,并将其传递给pygame,以便用户可以玩它。我用pyQt4研究了多线程,并尝试了各种不同的方法,我想这里的人可能会帮助我 这是下面我的GUI类中的一个方法: 我的线程类: 以及传递到Thread()类的QObject:Python 在PyQT4中读取并发音频文件,python,multithreading,python-3.x,pygame,pyqt4,Python,Multithreading,Python 3.x,Pygame,Pyqt4,我正在开发一个GUI应用程序,它可以播放音乐文件(由用户选择),同时播放这些音乐文件后面的背景声音,,同时保持一个响应良好的GUI主窗口。我试图使用多个线程来迭代for循环,调用列表中的每个文件,并将其传递给pygame,以便用户可以玩它。我用pyQt4研究了多线程,并尝试了各种不同的方法,我想这里的人可能会帮助我 这是下面我的GUI类中的一个方法: 我的线程类: 以及传递到Thread()类的QObject: 任何和所有的帮助将不胜感激 您当前的解决方案中有哪些不起作用?是否出现错误、线程是否
任何和所有的帮助将不胜感激 您当前的解决方案中有哪些不起作用?是否出现错误、线程是否未运行等?一旦线程启动,gui就会无响应,并且在播放第一个文件(并第二次迭代for循环)后,gui会冻结并停止播放。我希望能够在线程运行时保持GUI的响应性,并让它遍历列表中的每个项目,而不仅仅是一个项目1)pygame.mixer.get_busy():很容易导致无限循环,占用所有CPU并导致问题。2) 我以前从未见过
\uuu del\uuu
方法中的代码——请注意,当您执行del obj
时,对象不会调用该方法,而是当Python删除该对象时。(令人困惑)
def playsession(self):
""" Session Player """
if self.sessioncreated is True:
self.statusBar.showMessage("Now Playing...")
for x, i in enumerate(self.finalmusiclist): # A list of all of the files the user has selected to play
mainThread = Thread()
backThread = Thread()
main = SessionPlayer(i)
back = SessionPlayer(self.backgroundsoundslist[x]) # Passing In the Background sounds for iterated loop
main.moveToThread(mainThread)
back.moveToThread(backThread)
mainThread.started.connect(main.play)
mainThread.finished.connect(mainThread.quit)
backThread.started.connect(back.play)
ambThread.finished.connect(backThread.quit)
mainThread.start()
backThread.start()
class Thread(QtCore.QThread):
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
def start(self):
QtCore.QThread.start(self)
def run(self):
QtCore.QThread.run(self)
def __del__(self):
self.wait()
class SessionPlayer(QtCore.QObject):
def __init__(self, playfile):
QtCore.QObject.__init__(self)
self.playfile = playfile
@QtCore.pyqtSlot()
def play(self):
"""Method To Play Music Files With Background Simultaneously"""
pygame.init()
pygame.mixer.init(FREQ, BITSIZE, CHANNELS, BUFFER)
nextsnd = pygame.mixer.Sound(self.playfile)
nextsnd.play()
while pygame.mixer.get_busy():
pass
self.finished.emit()
def __del__(self):
self.wait()