Skip to main content
 首页 » 编程设计

Python,线程永不退出

2025年05月04日9yyy_WW

我正在用 Python 开发一个小型媒体播放器。我遇到的一个问题是我播放 .wav 文件的线程永远不会退出。我在下面提供了线程类,以及我如何处理线程的创建。

class myThread (threading.Thread): 
        def __init__(self, threadID, wf): 
            self.threadID = threadID 
            self.wf = wf 
            threading.Thread.__init__(self) 
        def run(self): 
            global isPaused 
            global isStopped         
 
            self.waveFile = wave.open(self.wf, 'rb')             
 
            #initialize stream 
            self.p = pyaudio.PyAudio() 
            self.stream = self.p.open(format = self.p.get_format_from_width(self.waveFile.getsampwidth()), channels = self.waveFile.getnchannels(), rate = self.waveFile.getframerate(), output = True) 
            self.data = self.waveFile.readframes(1024) 
 
            isPaused = False 
            isStopped = False 
            #main play loop, with pause event checking 
            while self.data != '': 
                while isPaused != True: 
                    if isStopped == False: 
                        self.stream.write(self.data) 
                        self.data = self.waveFile.readframes(1024) 
                    elif isStopped == True: 
                        self.stream.close() 
                        self.p.terminate() 
 
            self.stream.close() 
            self.p.terminate() 

我通过以下方式控制线程创建:

    foo = wx.FileDialog(self, message="Open a .wav file...", defaultDir=os.getcwd(), defaultFile="", style=wx.FD_MULTIPLE) 
    foo.ShowModal() 
 
    self.queue = foo.GetPaths() 
    self.threadID = 1        
 
    while len(self.queue) != 0: 
        self.song = myThread(self.threadID, self.queue[0]) 
        self.song.start() 
        while self.song.isAlive(): 
            time.sleep(2) 
        self.queue.pop(0) 
        self.threadID += 1 

如果您有任何想法,我将不胜感激。

请您参考如下方法:

是线程中的这段代码永不退出吗?还是主 while 循环?

while self.data != '': 
    while isPaused != True: 
     if isStopped == False: 
      self.stream.write(self.data) 
      self.data = self.waveFile.readframes(1024) 
     elif isStopped == True: 
      self.stream.close() 
      self.p.terminate() 

只是一个想法 - 从这看起来,如果停止,while 循环肯定不会退出,因为 self.data != '' 因为它是由 self 设置的。数据 = 行。只是一个想法。