2017-08-13 47 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函数,线程都会停止,并且在play函数执行后程序停止。无论如何,该函数发挥作用或事实上任何其他函数运行函数CheckingAudio线程调用,不会停止2原始线程。我试图运行播放函数作为自己的线程,但没有处理这样做,它只是给了我一个错误,说无法启动线程T3,途中被调用函数作为一个线程(这可能是错误的)

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

我试图创造playmusic类runplaythread功能但仍然给我错误无法启动线程。

回答

0

不确定它会解决您的问题,但您最后一个线程的目标是错误的,您正在使用self而不是d来调用您的实例listen

这是你的代码纠正,以替换上下文

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

注:评论可能早就确定,但没有足够的代表。

编辑:重新使用OP的上下文代码现在明确提到。 (虽然这是显而易见的)

编辑2:你在哪里打电话给你的第三个线程不清楚,但似乎不好,见评论。

+0

你真的从我的问题中拿走了代码并将其作为答案介绍了,我之所以使用'self.playmusicobject.play'是因为play函数在不同的类中。注意:投票可能是最好的,但对不起没有足够的代表 –

+0

正如在我的回答中所说的,你在代码中使用'self'而不是实例名'd'。我纠正了这一情况,并重新使用了您的代码进行上下文。我还提到我无法评论你的答案,并且它会比单独的答案更好。我会编辑它以便更明确,但请注意细节。 – FabienP

+0

此外,我不确定从类中启动线程(如果这是您的建议)是一个好主意,因为您在第一种方法中使用了“threadLock”。 – FabienP