Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;Microsoft SAPI:使用事件和泵消息异步说话_C++_Multithreading_Asynchronous_Sapi_Speech Synthesis - Fatal编程技术网

C++ C++;Microsoft SAPI:使用事件和泵消息异步说话

C++ C++;Microsoft SAPI:使用事件和泵消息异步说话,c++,multithreading,asynchronous,sapi,speech-synthesis,C++,Multithreading,Asynchronous,Sapi,Speech Synthesis,为了更好地理解这个问题,请参阅我前面的问题: 在Microsoft SAPI中,为了在使用SetNotifyCallbackFunction时传递文本到语音事件,您需要创建一个消息泵,下面是代码 现在我的问题是,我需要异步完成消息泵。我试过了,还有图书馆。但是每当我把信息泵放到另一个线程中。水泵坏了。每当我试图在另一个线程中调用Speak时,情况也是如此。我怎样才能解决这个问题?同样,我的目标是使MSAPI与事件异步说话 要调用消息泵,请执行以下操作: HANDLE hWait = pV-&g

为了更好地理解这个问题,请参阅我前面的问题:

在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;
}

我怀疑您需要在调用WaitAndPumpMessageWithTimeout之前创建消息队列

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

  • 调用
    ::peek消息(&Msg,NULL,0,0,PM\u NOREMOVE)
  • 创建一个窗口(此处仅消息窗口有用)

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

    我怀疑您需要在调用WaitAndPumpMessageWithTimeout之前创建消息队列

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

  • 调用
    ::peek消息(&Msg,NULL,0,0,PM\u NOREMOVE)
  • 创建一个窗口(此处仅消息窗口有用)

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

    我昨天忘记回答自己的问题了。但我会相信

    首先,我执行异步事件的目的是将它用作其他语言的库

    我昨天的研究就像Eric说的,所有SAPI交互必须发生在同一个线程上。因此,我通过创建一个派生自CWinThread的类来解决这个问题,CWinThread还具有SAPI功能。然后让包装器函数与派生的CWinThread类交互


    来源:

    我昨天忘了回答我自己的问题。但我会相信

    首先,我执行异步事件的目的是将它用作其他语言的库

    我昨天的研究就像Eric说的,所有SAPI交互必须发生在同一个线程上。因此,我通过创建一个派生自CWinThread的类来解决这个问题,CWinThread还具有SAPI功能。然后让包装器函数与派生的CWinThread类交互

    资料来源: