-2

Я разрабатываю приложение с распознаванием речи в C# с использованием оконных форм. Моя система имеет 3D-анимированный визуальный интерфейс, встроенный в приложение Windows Form. Визуальный компонент представляет собой COM-компонент (ActiveX). Визуальный компонент использует движок Text-to-speech (TTS), но для доступа к TTS я использую API-интерфейс компонента. Я напрямую не использую TTS с помощью SAPI. Механизм TTS, используемый визуальным компонентом, является TTS по умолчанию, доступным в Windows. Этот визуальный компонент имеет важное ограничение, он не может работать на нескольких ядрах. Поэтому, когда я запускаю приложение, я устанавливаю близость процессора к 1 ядру. Поскольку все находится в одном и том же виде, все части (то есть графическая визуализация, TTS, распознавание речи и т. Д.) Приложения работают с использованием 1 ядра.Многопоточность для пользовательского интерфейса WinForm/C#

Этот компонент постоянно отображает графику на экране, это интенсивный процесс, и он никогда не останавливается. Кроме того, работает встроенный распознаватель речи. Когда TTS активен, если пользователь разговаривает с системой, приложения замораживаются в течение нескольких секунд, а затем возвращаются в нормальное состояние. Я хочу решить эту проблему. Я попытался установить процесс оконной формы на более высокий приоритет, например, в режиме реального времени, высокий, но это не сработало.

Я хочу запускать в распознавателе речи или COM-компоненте в разной непрерывной нити, чем основной поток winform. Любые предложения, похожие образцы могут помочь.

+0

Попробуйте использовать [BackgroundWorker] (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker (v = vs.110) .aspx). – cubski

+0

Этот вопрос слишком широк для переполнения стека, который задает конкретные вопросы о кодировании с определенными ответами, но он может быть уместен для [programmers.stackexchange.com] (http://programmers.stackexchange.com), который предназначен для обсуждения концепций и передовых методов высокого уровня. Пожалуйста, прочитайте [этот мета-пост] (http://meta.stackexchange.com/a/82990/228805) для получения дополнительной информации. –

ответ

2

По умолчанию TTS доступен в Windows is SAPI. По умолчанию двигатели TTS & SR работают по отдельному потоку. Однако запрос SAPI TTS по умолчанию блокирует вызывающий поток (если только запрос TTS не выполняется с установленным флагом Async). (Запросы SR будут автоматически возвращаться к вызывающему потоку.)

Итак, если компонент выполняет вызовы TTS, вам необходимо будет изменить компонент, чтобы асинхронно выполнять вызовы TTS.

You can также использовать резьбу сродства (aka SetThreadAffinityMask API), чтобы заставить основной поток работать только на одном ядре. Тем не менее это может не исправить условия гонки. Использование аффинности процесса (SetProcessAffinityMask) не будет работать, так как оно затрагивает все потоки, и вам определенно требуется больше одного потока.

Смежные вопросы