私はスレッドから関数を呼び出していますが、関数の実行が開始されるとすぐに、関数の実行が終了するまで、プログラムはただ停止します。スレッドから関数を呼び出して元のスレッドをバックグラウンドで実行させる
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を開始することができませんでしたエラーが発生しました(これはおそらく間違っています)しかし、私はまだスレッドを開始することはできませんエラーを与えた。
あなたは文字通り自分の質問からコードを取り出し、答えとして紹介しました。なぜなら、私が 'self.playmusicobject.play'を使用している理由は、再生機能が別のクラスにあるからです。注:下の投票は、おそらく最高ですが、申し訳ありません十分な回答 –
私の答えで述べたように、あなたのコードでインスタンス名 'd'の代わりに' self'を使用しています。私はそれを修正し、あなたのコードを文脈のために再利用しました。私はあなたの答えをコメントすることができなかったし、それは別の答えよりもいいと言いました。私はそれをより明示的に編集しますが、詳細に注意してください。 – FabienP
また、あなたのクラス(あなたが提案したもの)からスレッドを開始することは、最初のメソッドで 'threadLock'を使用しているので、良い考えです。 – FabienP