Чтобы лучше понять этот вопрос, обратитесь к моему предыдущему вопросу:
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;
}
Я подозреваю, что вам нужно создать очередь сообщений перед вызовом WaitAndPumpMessagesWithTimeout.
Есть несколько способов сделать это:
::PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE)
Когда вы звоните Speak()
в отдельном потоке вы должны также создать объекты SAPI в этом потоке.
Я забыл ответить на свой вопрос вчера. Но я отдаю должное Эрик Бров
Во-первых, моя цель при создании события asynch — использовать его как библиотеку для другого языка.
То, что я исследовал вчера, было похоже на то, что сказал Эрик, все взаимодействия SAPI должны происходить в одном потоке. Поэтому я решаю эту проблему путем создания класса, производного от CWinThread, который также имеет функции SAPI. Затем я позволил функциям-оболочкам взаимодействовать с производным классом CWinThread.
Источник: http://www.codeproject.com/Articles/551/Using-User-Interface-Threads