用户界面WinForm / C#的多线程

时间:2014-02-12 20:07:42

标签: c# multithreading winforms speech-recognition text-to-speech

我正在使用Windows窗体在c#中开发一个带语音识别的应用程序。我的系统具有嵌入在windows窗体应用程序中的3D动画可视界面。可视组件是COM组件(ActiveX)。可视组件使用文本到语音(TTS)引擎但是为了访问TTS,我正在使用组件的API。我不是通过使用SAPI直接使用TTS。可视组件使用的TTS引擎是Windows上可用的默认TTS。这个可视组件有一个重要的限制,它不能在多个核心上工作。因此,当我启动应用程序时,我将CPU亲和力设置为1核心。因为所有内容都是相同的形式,所以应用程序的所有部分(即图形呈现,TTS,语音识别等等)都使用1核运行。

这个组件不断渲染一些图形到屏幕,这是一个密集的过程,它永远不会停止。此外,进程内语音识别器正在运行。当TTS处于活动状态时,如果用户对系统说话,应用程序会冻结几秒钟然后恢复正常。我想解决这个问题。我试图将窗体的过程设置为更高的优先级,如实时,高,但它不起作用。

我希望在主要winform线程的不同非停止线程中运行语音识别器或COM组件。任何建议,类似的样本可能会有所帮

1 个答案:

答案 0 :(得分:2)

Windows 上可用的默认TTS是 SAPI。默认情况下,TTS& SR引擎在单独的线程上运行。但是,默认的SAPI TTS请求将阻止调用线程(除非TTS请求是使用Async标志设置的)。 (SR请求将自动封送回调用线程。)

因此,如果组件正在进行TTS调用,则需要修改组件以异步进行TTS调用。

可以也使用线程关联(也就是SetThreadAffinityMask API)来强制主线程只在一个核心上运行。但这可能无法解决竞争条件。使用进程关联(SetProcessAffinityMask)将不起作用,因为它会影响所有线程,并且您肯定需要多个线程。