2010-06-16 3 views
2

Я разрабатываю небольшой медиаплеер на Python. Проблема, с которой я столкнулся, заключается в том, что мой поток, который воспроизводит файл .wav, никогда не выходит. Я представил класс потоков и как я обрабатываю создание потока ниже.Python, Thread никогда не выходит

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 

Если у вас есть какие-либо идеи, я ценю это.

ответ

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 = линии. Просто мысль.

+0

Да, это то, что вызывается после того, как я создаю поток и дать команду Thread.start() – Michael

+0

, но это, где он застревает? вы знаете? возможно время, чтобы немного отладить с заявлениями печати;) – tjvr

0

Вам нужно убедиться, что вы установили self.data ничто, если isStopped is True.

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() 
Смежные вопросы