2017-08-13 7 views
0

私はスレッドから関数を呼び出していますが、関数の実行が開始されるとすぐに、関数の実行が終了するまで、プログラムはただ停止します。スレッドから関数を呼び出して元のスレッドをバックグラウンドで実行させる

class listen(threading.Thread): 

    def __init__(self): 
     threading.Thread.__init__(self) 
     self.playmusicobject = playmusic() 
     self.objectspeak = speak() 
     self.apiobject = googleAPI() 

    def listening(self): 

     self.r = sr.Recognizer() 
     threadLock.acquire() 
     try: 

      with sr.Microphone() as source: 
       print("say something") 
       self.audio = self.r.listen(source) 

     finally: 
      threadLock.release() 

    def checkingaudio(self): 

     threadLock.acquire() 
     try: 
      # a = str(self.r.recognize_google(self.audio)) 
      a = str(self.r.recognize_google(self.audio)) 
      print(a) 
      if a in greetings: 
       self.objectspeak.speaking("I am good how are you?") 

      if a in music: 
       print("playing music") 
       self.playmusicobject.play() 

      if a in stop: 
       print("stopping") 
       self.playmusicobject.b() 

      if a in api: 
       self.apiobject.distance() 
     finally: 
      threadLock.release() 

class playmusic: 

    def play(self): 
     playsound.playsound("playthisfile") 

if __name__ == "__main__": 
    while 1: 
     d = listen() 
     t1 = threading.Thread(target=d.listening) 
     t1.start() 
     t2 = threading.Thread(target=d.checkingaudio) 
     t2.start() 

私がplaymusicでplay関数を呼び出すときはいつも、両方のスレッドがおそらく停止し、再生関数の実行後にプログラムが停止します。とにかく関数が実行されているか、事実上、関数CheckingAudioを実行しているスレッドによって呼び出された他の関数は、元の2つのスレッドを停止しません。自分自身のスレッドとして再生関数を実行しようとしましたが、そう、

 if a in music: 
      print("playing music") 
      t3 = threading.Thread(target=self.playmusicobject.play) 
      t3.start() 

私はplaymusicクラスでrunplaythread関数を作成しようとしたそれはちょうど私のスレッドがあったように、方法は、関数を呼び出したスレッドT3を開始することができませんでしたエラーが発生しました(これはおそらく間違っています)しかし、私はまだスレッドを開始することはできませんエラーを与えた。

答えて

0

最後のスレッドのターゲットが間違っていることを確認できない場合は、dの代わりにselfを使用して、listenというインスタンスを呼び出しています。

はコンテキストを置き換えるために修正これはあなたのコードです:

if a in music: 
     print("playing music") 
     t3 = threading.Thread(target=d.playmusicobject.play) 
     t3.start() 

注:コメントはおそらくOKますが、十分ではない担当者だったでしょう。

EDIT:コンテキストのOPコードの再利用が明示されました。 (それは十分明白でしたが)

EDIT2:あなたの3番目のスレッドを呼び出しているところは明確ではありませんでしたが、確認できませんでした。コメントを参照してください。

+0

あなたは文字通り自分の質問からコードを取り出し、答えとして紹介しました。なぜなら、私が 'self.playmusicobject.play'を使用している理由は、再生機能が別のクラスにあるからです。注:下の投票は、おそらく最高ですが、申し訳ありません十分な回答 –

+0

私の答えで述べたように、あなたのコードでインスタンス名 'd'の代​​わりに' self'を使用しています。私はそれを修正し、あなたのコードを文脈のために再利用しました。私はあなたの答えをコメントすることができなかったし、それは別の答えよりもいいと言いました。私はそれをより明示的に編集しますが、詳細に注意してください。 – FabienP

+0

また、あなたのクラス(あなたが提案したもの)からスレッドを開始することは、最初のメソッドで 'threadLock'を使用しているので、良い考えです。 – FabienP

関連する問題