Требуется ли для распознавания речи с использованием .NET Framework насос сообщений? - PullRequest
1 голос
/ 12 апреля 2010

Я пишу плагин (файл dll) и создаю WinForm в качестве его интерфейса / диалога. Если для этого требуется насос сообщений, как и где я должен его создать?

Ответы [ 3 ]

2 голосов
/ 12 апреля 2010

SpeechRecognitionEngine - это оболочка для COM-сервера с многопоточным подключением. Да, для них жестким требованием является как минимум один поток, который является STA и прокачивает цикл сообщений. Поскольку вы пишете библиотеку, вы не можете контролировать то, что выбирает ваш клиент. Но вы можете сказать ей, что есть проблема, а не просто тупик вашего распознавателя речи. Добавьте эту проверку в ваш конструктор класса:

  if (System.Threading.Thread.CurrentThread.GetApartmentState() !=
      System.Threading.ApartmentState.STA) {
    throw new InvalidOperationException("UI thread required");
  }

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

1 голос
/ 12 апреля 2010

Вам не нужно создавать его, приложение WinForm имеет его.

0 голосов
/ 12 апреля 2010

Если вы создаете приложение Winforms обычным способом, оно создаст свой собственный насос сообщений. Это все, что вам нужно.

...