Распознавание речи не запускает EventHandler в C++/CLI DLL

У меня есть плагин TS3 в создании прямо здесь, который использует System::Speech::Recognition для его SpeechRecognitinEngine, Теперь я создаю EventHandler для SpeechRecognized событие.

Что ж, мои записи (и действия плагина - Нет) говорят мне, что Событие на самом деле никогда не запускается, даже если вы начинаете и прекращаете говорить с (несколько) действительными (частями) грамматикой.

Я понятия не имею, почему это так. Это происходит в DLL, написанной на C++ CLI. Моя теория заключалась в том, что библиотеки DLL не поддерживают обработчики событий... Возможно ли это?

void recogn_speech() {
    uint64 schid = ts3Functions.getCurrentServerConnectionHandlerID();

    SpeechRecognitionEngine^ recognizer = gcnew SpeechRecognitionEngine();

    System::Speech::Recognition::Grammar^ g = assembleGrammar();
    recognizer->LoadGrammar(g);
    recognizer->SetInputToDefaultAudioDevice();

    char pluginPath[PATH_BUFSIZE];
    ts3Functions.getPluginPath(pluginPath, PATH_BUFSIZE, pluginID);
    String^ a = gcnew String(pluginPath);
    a = a + "vctest_cpp_ts3\\signal_vc_start.wav";
    char* newPath = (char*)(void*)Marshal::StringToHGlobalAnsi(a);
    ts3Functions.playWaveFile(schid, newPath);
    Marshal::FreeHGlobal((IntPtr)newPath);

    recognizer->SpeechRecognized += 
        gcnew EventHandler<SpeechRecognizedEventArgs^>(this, &tsapi::sre_SpeechRecognized);
}

void sre_SpeechRecognized(Object^ sender, SpeechRecognizedEventArgs^ e)
{
    uint64 schid = ts3Functions.getCurrentServerConnectionHandlerID();
    String^ recognRes = e->Result->Text->ToString();
    interpretCommand(recognRes);
}

Полный исходный код на GitHub

1 ответ

Ваш обработчик событий выглядит правильно. Нет проблем с наличием событий и обработчиков событий в разных DLL: это весь управляемый код, граница DLL здесь не имеет значения.

Тем не менее, есть одна возможная проблема:

void recogn_speech() {
    ...
    SpeechRecognitionEngine^ recognizer = gcnew SpeechRecognitionEngine();
    ...
}

Возможно, вы захотите сохранить объект SpeechRecognitionEngine где-нибудь, чтобы он не собирал мусор.

Кроме того, вы можете захотеть перейти к более C++-стилю - иметь определения классов в файлах.h и реализации в файлах.cpp. Поскольку ваш код становится более сложным, и классы должны ссылаться друг на друга, наличие всего в одном файле станет проблемой.

Другие вопросы по тегам