【问题标题】:Multi-threading For User Interface WinForm/C# [closed]用于用户界面 WinForm/C# 的多线程 [关闭]
【发布时间】:2014-02-12 20:07:42
【问题描述】:

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

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

我想在与 winform 主线程不同的不间断线程中运行语音识别器或 COM 组件。任何建议,类似的样本可能会有所帮助。

【问题讨论】:

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


【解决方案1】:

Windows 上可用的默认 TTS SAPI。默认情况下,TTS 和 SR 引擎在单独的线程上运行。但是,默认的 SAPI TTS 请求将阻塞调用线程(除非 TTS 请求是在设置了 Async 标志的情况下发出的)。 (SR 请求将自动编组回调用线程。)

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

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

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多