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函数,线程都会停止,并且在play函数执行后程序停止。无论如何,该函数发挥作用或事实上任何其他函数运行函数CheckingAudio线程调用,不会停止2原始线程。我试图运行播放函数作为自己的线程,但没有处理这样做,它只是给了我一个错误,说无法启动线程T3,途中被调用函数作为一个线程(这可能是错误的)
if a in music:
print("playing music")
t3 = threading.Thread(target=self.playmusicobject.play)
t3.start()
我试图创造playmusic类runplaythread功能但仍然给我错误无法启动线程。
你真的从我的问题中拿走了代码并将其作为答案介绍了,我之所以使用'self.playmusicobject.play'是因为play函数在不同的类中。注意:投票可能是最好的,但对不起没有足够的代表 –
正如在我的回答中所说的,你在代码中使用'self'而不是实例名'd'。我纠正了这一情况,并重新使用了您的代码进行上下文。我还提到我无法评论你的答案,并且它会比单独的答案更好。我会编辑它以便更明确,但请注意细节。 – FabienP
此外,我不确定从类中启动线程(如果这是您的建议)是一个好主意,因为您在第一种方法中使用了“threadLock”。 – FabienP