2011-06-25 22 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 

を、releventコードは次のとおりです。

music = MusicThread(thesong) 
music.start() 

これが意味する必要があります私は歌が通過遊んで得ることができるということです私はそれを停止するためにメインスレッドでコマンドを発行するまで、セカンダリスレッド。私はロックを使用してwait()か何かをしなければならないと思いますか?

答えて

3

ここでははるかに簡単な解決策があります。すでに独自のスレッドでオーディオを再生しているAudiereライブラリを使用しています。したがって、オーディオを再生するために自分の第2のスレッドを生成する必要はありません。代わりに、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

[link] http://pastebin.com/s2Zh97Z6 – Tagc