【发布时间】:2013-09-18 09:58:15
【问题描述】:
为了更好地理解这个问题,请参考我之前的问题:
C++ MSAPI 5: SetNotifyCallbackFunction not working
在 Microsoft SAPI 中,为了在您使用 SetNotifyCallbackFunction 时传递文本转语音事件,您需要创建一个消息泵,下面是代码。
现在我的问题是我需要异步完成消息泵。我已经尝试过std::thread、pthread 和boost 库。但是每当我将消息泵放在另一个线程中时。泵发生故障。每当我尝试在另一个线程中调用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;
}
【问题讨论】:
标签: c++ multithreading asynchronous sapi speech-synthesis