2011-06-25 66 views
3

我是線程新手,並且我不太瞭解如何使用條件。目前,我有一個線程類是這樣的:線程和條件

class MusicThread(threading.Thread): 
    def __init__(self, song): 
     threading.Thread.__init__(self) 
     self.song = song 
    def run(self): 
     self.output = audiere.open_device() 
     self.music = self.output.open_file(self.song, 1) 
     self.music.play() 
     #i want the thread to wait indefinitely at this point until 
     #a condition/flag in the main thread is met/activated 

在主線程中,培訓相關的代碼是:

music = MusicThread(thesong) 
music.start() 

什麼這應該的意思是,我能得到一首歌曲通過打輔助線程,直到我在主線程中發出命令來停止它。我猜我不得不使用鎖和等待()或什麼?

回答

3

這裏有一個更簡單的解決方案。您正在使用Audiere庫,該庫已在其自己的線程中播放音頻。因此,不需要爲了播放音頻而自行產生第二個線程。相反,直接從主線程使用Audiere,並停止主線程。

2

Matt Campbell的答案可能是對的。但也許你想用其他原因使用線程。如果是的話,你會發現一個Queue.Queue非常有用:

>>> import threading 
>>> import Queue 
>>> def queue_getter(input_queue): 
...  command = input_queue.get() 
...  while command != 'quit': 
...   print command 
...   command = input_queue.get() 
... 
>>> input_queue = Queue.Queue() 
>>> command_thread = threading.Thread(target=queue_getter, args=(input_queue,)) 
>>> command_thread.start() 
>>> input_queue.put('play') 
>>> play 
input_queue.put('pause') 
pause 
>>> input_queue.put('quit') 
>>> command_thread.join() 

command_thread確實在隊列中讀取一個阻塞,等待命令隊列被投入。它會繼續讀取和打印隊列中的命令,直到發出命令'quit'

+0

是的馬特,我第一次嘗試它只是在主線程中的所有代碼。問題是音樂沒有播放。 :\我不知道爲什麼。 Senderle,我也試過你的解決方案。同樣的問題;沒有錯誤信息,但歌曲不播放。 – Tagc

+0

[鏈接] http://pastebin.com/s2Zh97Z6 – Tagc