gpt4 book ai didi

C++ 微软 SAPI : Speak with event and Pump Message asynchronously

转载 作者:搜寻专家 更新时间:2023-10-31 01:07:48 27 4
gpt4 key购买 nike

为了更好地理解这个问题,请引用我之前的问题:

C++ MSAPI 5: SetNotifyCallbackFunction not working

在 Microsoft SAPI 中,为了在您使用 SetNotifyCallbackFunction 时传送文本到语音事件,您需要创建一个消息泵,下面是代码。

现在我的问题是我需要异步完成消息泵。我试过 std::thread , pthreadboost图书馆。但是每当我将消息泵放在另一个线程中时。泵发生故障。每当我尝试在另一个线程中调用 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 之前创建消息队列。

有几种方法可以做到这一点:

  1. 调用 ::PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE)
  2. 创建一个窗口(仅消息窗口在这里很有用)

当您在单独的线程上调用 Speak() 时,您也应该在该线程上创建 SAPI 对象。

关于C++ 微软 SAPI : Speak with event and Pump Message asynchronously,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18869198/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com