многопоточность — C ++ Microsoft SAPI: говорить с событием и сообщением Pump асинхронно

Чтобы лучше понять этот вопрос, обратитесь к моему предыдущему вопросу:

C ++ MSAPI 5: функция SetNotifyCallback не работает

В Microsoft SAPI для доставки событий преобразования текста в речь при использовании SetNotifyCallbackFunction вам нужно создать насос сообщений, ниже приведен код.

Теперь моя проблема в том, что мне нужно, чтобы насос сообщений выполнялся асинхронно. Я попробовал станд :: нить, потоковой и увеличение библиотека. Но всякий раз, когда я помещаю сообщение насос в другую ветку. Насос вышел из строя. Это также тот случай, когда я пытался позвонить Speak в другой теме. Как я могу решить это? Опять же, моя цель — заставить MSAPI говорить асинхронно с событиями.

чтобы вызвать сообщение насоса:

HANDLE hWait = pV->SpeakCompleteEvent();
WaitAndPumpMessagesWithTimeout(hWait, INFINITE);

фактический код сообщения сообщения:

HRESULT WaitAndPumpMessagesWithTimeout(HANDLE hWaitHandle, DWORD dwMilliseconds)
{
HRESULT hr = S_OK;
BOOL fContinue = TRUE;

while (fContinue)
{
DWORD dwWaitId = ::MsgWaitForMultipleObjectsEx(1, &hWaitHandle, dwMilliseconds, QS_ALLINPUT, MWMO_INPUTAVAILABLE);
switch (dwWaitId)
{
case WAIT_OBJECT_0:
{
fContinue = FALSE;
}
break;

case WAIT_OBJECT_0 + 1:
{
MSG Msg;
while (::PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&Msg);
::DispatchMessage(&Msg);
}
}
break;

case WAIT_TIMEOUT:
{
hr = S_FALSE;
fContinue = FALSE;
}
break;

default:// Unexpected error
{
fContinue = FALSE;
hr = E_FAIL;
}
break;
}
}
return hr;
}

2

Решение

Я подозреваю, что вам нужно создать очередь сообщений перед вызовом WaitAndPumpMessagesWithTimeout.

Есть несколько способов сделать это:

  1. вызов ::PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE)
  2. Создать окно (здесь полезны только окна сообщений)

Когда вы звоните Speak() в отдельном потоке вы должны также создать объекты SAPI в этом потоке.

3

Другие решения

Я забыл ответить на свой вопрос вчера. Но я отдаю должное Эрик Бров

Во-первых, моя цель при создании события asynch — использовать его как библиотеку для другого языка.

То, что я исследовал вчера, было похоже на то, что сказал Эрик, все взаимодействия SAPI должны происходить в одном потоке. Поэтому я решаю эту проблему путем создания класса, производного от CWinThread, который также имеет функции SAPI. Затем я позволил функциям-оболочкам взаимодействовать с производным классом CWinThread.

Источник: http://www.codeproject.com/Articles/551/Using-User-Interface-Threads

1

По вопросам рекламы [email protected]