AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 18.06.2008, 09:41   #1  
Jox ist offline
Jox
Developer
Benutzerbild von Jox
 
112 / 24 (1) +++
Registriert seit: 26.07.2005
Ort: Питер
Lightbulb Speech API в Axapta
Интегрировал в Axapta Speech API. Осталась только небольшая проблемка...
X++:
static client void speak(str _text)
{
    com             spVoice;
    ;

    if (!SysUserInfo::find().enabledSpeechEngine)
        return;

    spVoice = new com("{96749377-3391-11D2-9EE3-00C04F797396}");

    if (!spVoice)
        return;

    spVoice.Rate(10);
    spVoice.speak(_text);
}
Заключается она в том, что com-метод spVoice.speak(_text) необходимо выполнять параллельно. Для этого указывается второй параметр spVoice.speak(_text, 1); (Default - 0). В Visual Studio - работает, в Delphi - работает, а вот, в Axapta молчание
У меня такое подозрение, что Axapta не "умеет" выполнять com-методы параллельно.

У кого-нибудь есть мысли на этот счет?
Alt 18.06.2008, 10:18   #2  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
попробуйте выделить com-объект в отдельный thread.
см. tutorial-объекты по поводу нитей.
см. также обсуждения нитей здесь
__________________
полезное на axForum, github, vk, coub.
Alt 18.06.2008, 10:29   #3  
Jox ist offline
Jox
Developer
Benutzerbild von Jox
 
112 / 24 (1) +++
Registriert seit: 26.07.2005
Ort: Питер
Сергей, я уже пробовал выполнять код в нитке, но тоже - молчание
X++:
    Thread  t = new Thread();
    ;

    t.setInputParm(["Сумма накладной №00223: Один рубль 12 коп."]);
    t.run(classNum(SpeechEngine), identifierStr(speak));
Alt 18.06.2008, 12:37   #4  
Jox ist offline
Jox
Developer
Benutzerbild von Jox
 
112 / 24 (1) +++
Registriert seit: 26.07.2005
Ort: Питер
Больше мыслей ни у кого нет?
Гуглил - не шибко помогло
Alt 18.06.2008, 12:56   #5  
RumataEstor ist offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Registriert seit: 29.04.2008
Ort: Москва
Очевидно, проблема не в том, что что-то не проигрывается. А в том, что COM объект удаляется сразу при выходе из процедуры. Чтобы этого не происходило, необходимо, чтобы переменная, содержащая ссылку на COM-объект не удалялась до тех пор, пока текст читается.
This post has been rated by: Jox (1).
Alt 18.06.2008, 13:09   #6  
Jox ist offline
Jox
Developer
Benutzerbild von Jox
 
112 / 24 (1) +++
Registriert seit: 26.07.2005
Ort: Питер
Zitat:
Zitat von RumataEstor Beitrag anzeigen
Очевидно, проблема не в том, что что-то не проигрывается. А в том, что COM объект удаляется сразу при выходе из процедуры. Чтобы этого не происходило, необходимо, чтобы переменная, содержащая ссылку на COM-объект не удалялась до тех пор, пока текст читается.
Отличная идея! И главное, абсолютно верная, что-то не ожидал я такой топорной реализации от Axapta
Alt 18.06.2008, 13:31   #7  
RumataEstor ist offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Registriert seit: 29.04.2008
Ort: Москва
На самом деле, предложение mazzy вполне работоспособно, если speak вызывать синхронно (с флагом 0).
Alt 18.06.2008, 13:33   #8  
Jox ist offline
Jox
Developer
Benutzerbild von Jox
 
112 / 24 (1) +++
Registriert seit: 26.07.2005
Ort: Питер
Zitat:
Zitat von RumataEstor Beitrag anzeigen
На самом деле, предложение mazzy вполне работоспособно, если speak вызывать синхронно (с флагом 0).
На самом деле я это и имел ввиду, но мне нужно вызывать с флагом Async, дабы функционал работал дальше, а параллельно происходил синтез речи.
Alt 18.06.2008, 13:35   #9  
Jox ist offline
Jox
Developer
Benutzerbild von Jox
 
112 / 24 (1) +++
Registriert seit: 26.07.2005
Ort: Питер
Дык вот пока не удается синтезировать речь в отдельном потоке, вне потока работает нормально, только Axapta не отвечает (чего и следовало ожидать). Такой же эффект получается при синтезе с флагом 0.
Alt 18.06.2008, 13:37   #10  
RumataEstor ist offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Registriert seit: 29.04.2008
Ort: Москва
Zitat:
Zitat von Jox Beitrag anzeigen
На самом деле я это и имел ввиду, но мне нужно вызывать с флагом Async, дабы функционал работал дальше, а параллельно происходил синтез речи.
X++:
Thread  t = new Thread();
;

t.setInputParm(["Сумма накладной №00223: Один рубль 12 коп."]);
t.run(classNum(SpeechEngine), identifierStr(speak)); // там флаг 0

// тут можно писать остальной функционал,
// который должен работать параллельно с озвучкой.
А, хотя Аксапта так же может убить поток, когда эта функция закончится. Надо проверять.

Geändert von RumataEstor (18.06.2008 um 13:40 Uhr)
Alt 18.06.2008, 13:51   #11  
Jox ist offline
Jox
Developer
Benutzerbild von Jox
 
112 / 24 (1) +++
Registriert seit: 26.07.2005
Ort: Питер
Zitat:
Zitat von RumataEstor Beitrag anzeigen
X++:
// тут можно писать остальной функционал,
// который должен работать параллельно с озвучкой.
хехе, так не пойдет, метод теряет смысл
Нельзя длительность синтеза сравнивать с длительностью выполнения кода до конца метода.
Alt 18.06.2008, 14:25   #12  
kashperuk ist offline
kashperuk
Участник
Benutzerbild von kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4.361 / 2084 (78) +++++++++
Registriert seit: 30.05.2004
Ort: Atlanta, GA, USA
А если попробовать просто winApi::shellExecute и запустить написанное на .NET приложение, выполняющее озвучку? И в shellExecute параметры указать так, чтобы АХ не дожидалась завершения выполнения приложения?
Код дальше в АХ при этом нормально выполняться должен
Alt 18.06.2008, 14:49   #13  
Jox ist offline
Jox
Developer
Benutzerbild von Jox
 
112 / 24 (1) +++
Registriert seit: 26.07.2005
Ort: Питер
Zitat:
Zitat von kashperuk Beitrag anzeigen
А если попробовать просто winApi::shellExecute и запустить написанное на .NET приложение, выполняющее озвучку? И в shellExecute параметры указать так, чтобы АХ не дожидалась завершения выполнения приложения?
Код дальше в АХ при этом нормально выполняться должен
тут сразу же напрашиваются две проблемы:
1. Воспроизводимый текст ограничен по длине (это при определенном подходе не так страшно).
2. "Тормоза", пока приложение загрузится, потом еще com-объект синтезирует речь, и в общем получится весьма неприятная задержка.
Alt 18.06.2008, 14:54   #14  
RumataEstor ist offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Registriert seit: 29.04.2008
Ort: Москва
Если в Аксапте можно реализовывать синглтоны, то можно создавать единственный spVoice при первой необходимости. Везде пользоваться только им и удалять его при завершении работы клиента.
Alt 18.06.2008, 15:02   #15  
DSPIC ist offline
DSPIC
Боец
 
1.077 / 1243 (44) ++++++++
Registriert seit: 11.04.2008
Быть может просто закэшировать объект ?
\Classes\Info\globalCache
This post has been rated by: Jox (1).
Alt 18.06.2008, 16:24   #16  
Jox ist offline
Jox
Developer
Benutzerbild von Jox
 
112 / 24 (1) +++
Registriert seit: 26.07.2005
Ort: Питер
Thumbs up
Всем спасибо за мысли.
Решение найдено
Код во вложении, кому интересно...
Реализовал при помощи globalCache
Angehängte Dateien
Dateityp: xpo SpeechEngine.xpo (2,3 KB, 342x aufgerufen)
Alt 18.06.2008, 16:36   #17  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
Zitat:
Zitat von Jox Beitrag anzeigen
Отличная идея! И главное, абсолютно верная, что-то не ожидал я такой топорной реализации от Axapta
почему топорная? обычная java. освобождает память из-под объекта, если объект никем не используется
__________________
полезное на axForum, github, vk, coub.
Alt 18.06.2008, 16:47   #18  
RumataEstor ist offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Registriert seit: 29.04.2008
Ort: Москва
X++:
SysGlobalCache globalCache = infolog.objectOnServer() ?
        appl.globalCache() : infolog.globalCache();
А зачем пользоваться infolog.globalCache()? Я так понимаю, appl.globalCache() всегда на клиенте? Тогда почему бы всегда не пользоваться только им?
Alt 18.06.2008, 17:26   #19  
belugin ist offline
belugin
Участник
Benutzerbild von belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4.622 / 2925 (107) +++++++++
Registriert seit: 16.01.2004
Blog-Einträge: 5
appl - на сервере infolog - на клиенте
Stichworte
sound, звук, озвучка

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
axaptabuilder: How to build Axapta application from XPO files stored in Visual Source Safe. Blog bot DAX Blogs 0 12.04.2007 16:10
axaptabuilder: How to build Axapta application from XPO files stored in Visual Source Safe. Blog bot DAX Blogs 0 22.11.2006 15:20
axaptabuilder: How to setup Axapta batch server running as user defined windows service Blog bot DAX Blogs 0 28.10.2006 16:47
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 02:31 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.