这是一个有效的程序(我能够在实际操作中听到文本到语音):
import pyttsx
import threading
def saythread(location, text):
engine = pyttsx.init()
engine.say(text)
engine.runAndWait()
e = (1, "please work, oh my god")
t = threading.Thread(target=saythread,args=e,name='sayitthread')
t.start()
如果程序更改为
^{pr2}$然后它就被“卡住”了引擎。运行并等待()”而且文本到语音转换不起作用。我猜问题在于线程作用域的规则。正确的? 基本上我想要的是。。主线程中引擎变量的“句柄”。这样我就可以打电话了发动机.停止()从主线程。在
希望我说得通
谢谢
全局变量几乎总是一个糟糕的方法。您只需将
engine
作为参数传递给saythread
:但是我敢打赌,真正的问题是您的
engine
对象上的方法并不是为从其他线程调用而设计的。(范围界定与此无关,顺便说一句,它取决于底层库的设计。)您可以使用锁来解决问题:
^{pr2}$…但只有当您同时对
engine
对象执行它不喜欢的其他操作时,这才有帮助。从你的代码来看,情况似乎并非如此,因此你可能不得不在线程中创建每个引擎对象,并找到另一种方法来传递状态。或者,您可以将engine
保留在主线程中,并使用队列从正在执行其他工作的其他线程调用它。在值得记住的是,并不是所有的Python库(尤其是用C编写的库)都支持线程,所以您必须小心,阅读文档或询问作者。在
相关问题 更多 >
编程相关推荐