Python,线程无法退出

2 投票
2 回答
1010 浏览
提问于 2025-04-16 00:03

我正在用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

如果你有什么想法,我会很感激。

2 个回答

0

你需要确保当isStopped为真时,把self.data设置为空。

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

self.stream.close()
self.p.terminate()
0

这个线程里的代码是永远不会结束吗?还是说主要的 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()

我只是随便想想 - 从这个情况来看,如果 self.data 被设置了,像 self.data != '' 这样的条件就会一直成立,这样的话 while 循环就不会结束了。只是我的一个想法。

撰写回答