Помогите разобраться с ошибкой голосового движка luacom

Страницы: 1
RSS
Помогите разобраться с ошибкой голосового движка luacom
 
В макросе использую произнесение голосом разных событий.

Функция чтения голосом выглядит вот так:

text = "тест"


w32.CoInitialize()              

local vObj = luacom.CreateObject("Sapi.SpVoice")vObj:Speak (text)

Как правило все работает без проблем. Но иногда, почему-то данная функция выдает ошибку
...\Program\QuikRobots\автостоп\. .\автостоп\library.lua:31: COM exception:(..\src\library\tLuaCOM.cpp,386):

Самое неприятное, что весь скрипт после этого останавливается, и это напрягает.
Как правило, если потом перезапустить скрипт, ошибка уже повторяется. пока терминал не перезагрузишь или даже компьютер.

Может кто-то знает как решить проблему?
1) либо устранить ошибку совсем
2 ) либо научиться определять, что эта ошибка есть, и как-то не давать скрипту останавливаться
 
Цитата
Sergey Denegin написал:
почему-то данная функция выдает ошибку
Это какая-то ошибка при вызове функции, см.https://github.com/davidm/luacom/blob/master/src/library/tLuaCOM.cpp#L386
Может этот кусок (с вызовом Speak) в pcall завернуть, пусть лучше один раз звука не будет, чем крэш всего из-за не очень-то нужной фичи.

Цитата
Sergey Denegin написал:
w32.CoInitialize()  
Надо убедиться, что этот вызов в main делается, а не где-то еще. В потоке квика уже все было вызвано самим квиком, там CoInitialize вообще-то не нужна. А в мейне нужна. И в конце мейна еще CoUninitialize() надо.

Цитата
Sergey Denegin написал:
Как правило, если потом перезапустить скрипт, ошибка уже повторяется. пока терминал не перезагрузишь
А это косячок в квике, при ошибке длл не выгружается и вообще много чего не подчищается.
 
Спасибо большое, испоьльзую pcall - это то, что нужно.


CoUninitialize() поставил

Огромное спасибо!
 
Цитата
Sergey Denegin написал:
В макросе использую произнесение голосом разных событий.

Функция чтения голосом выглядит вот так:

text = "тест"


w32.CoInitialize()              

local vObj = luacom.CreateObject("Sapi.SpVoice")vObj:Speak (text)

Как правило все работает без проблем. Но иногда, почему-то данная функция выдает ошибку
...\Program\QuikRobots\автостоп\. .\автостоп\library.lua:31: COM exception:(..\src\library\tLuaCOM.cpp,386):

Самое неприятное, что весь скрипт после этого останавливается, и это напрягает.
Как правило, если потом перезапустить скрипт, ошибка уже повторяется. пока терминал не перезагрузишь или даже компьютер.

Может кто-то знает как решить проблему?
1) либо устранить ошибку совсем
2 ) либо научиться определять, что эта ошибка есть, и как-то не давать скрипту останавливаться
это ошибка в вашей  library.lua  строка 31
на всякий случай, вот исходник tLuaCOM.cpp
https://github.com/davidm/luacom/blob/9962eb574ddb34692eb4503fe67fd7d363ff2­0a0/src/library/tLuaCOM.c...
оператор 386 выдает сообщение  об ошибке, если она есть
 
 
Цитата
Николай Камынин написал:
это ошибка в вашей  library.lua  строка 31
в этой строке оператор vObj:Speak (text)
Цитата
Николай Камынин написал:
оператор 386 выдает сообщение  об ошибке, если она есть
так ведь ситуация в том. что бОльшинство раз все работает нормально, а потом что-то происходит, и начинает выдаваться ошибку. Возможно память не очищается и забивается. посмотрим что будет с добавленной командой CoUninitialize() и использованием pcall
 
Цитата
Sergey Denegin написал:
Цитата
Николай Камынин написал:
это ошибка в вашей  library.lua  строка 31
в этой строке оператор vObj:Speak (text)
Цитата
Николай Камынин написал:
оператор 386 выдает сообщение  об ошибке, если она есть
так ведь ситуация в том. что бОльшинство раз все работает нормально, а потом что-то происходит, и начинает выдаваться ошибку. Возможно память не очищается и забивается. посмотрим что будет с добавленной командой CoUninitialize() и использованием pcall
сказать что-то конкретнее без текста скрипта сложно.
могу предположить что какие-то данные в какой-то момент отсутствуют
У вас скорее всего это не проверяется и возникает ошибка например сравнение с nil
в итоге происходит вылет скрипта (по такой ошибке бывает пропуск операторов) и в итоге кирдык
еще хуже если попадаете в память вне области массивов
короче надо ставить контрольные точки и искать что и где
можете выложить код, попробую что-то сказать конкретнее  
 
и еще
что у вас в 31 строке  library.lua ?
 
Цитата
Николай Камынин написал:
и еще
что у вас в 31 строке  library.lua ?
Вот полная функция
function speak_only (text)
   w32.CoInitialize()
   local vObj = luacom.CreateObject("Sapi.SpVoice")
   vObj:Speak (text)
   w32.CoUninitialize()
end --speak_only

строка 31 содержит оператор
vObj:Speak (text)

А каким образом остальной код может влиять на абсолютно независимую от остального кода функцию?
тут все переменные локальны.
Текст всегда передается строковой переменной из одной и той же другой функции, в которой физически не может быть не строковой переменной.
И главная проблема в том. что бОльшую часть времени все работает.

В общем на данный момент пока вопрос закрыл с помощью оператора pcall, если будут снова проблемы, опишу ситуацию.

Благодарю всех, кто откликнулся на помощь!
 
Цитата
Sergey Denegin написал:
Цитата
Николай Камынин написал:
и еще
что у вас в 31 строке  library.lua ?
Вот полная функция
function speak_only (text)
   w32.CoInitialize()
   local vObj = luacom.CreateObject("Sapi.SpVoice")
   vObj:Speak (text)
   w32.CoUninitialize()
end --speak_only

строка 31 содержит оператор
vObj:Speak (text)

А каким образом остальной код может влиять на абсолютно независимую от остального кода функцию?
тут все переменные локальны.
Текст всегда передается строковой переменной из одной и той же другой функции, в которой физически не может быть не строковой переменной.
И главная проблема в том. что бОльшую часть времени все работает.

В общем на данный момент пока вопрос закрыл с помощью оператора pcall, если будут снова проблемы, опишу ситуацию.

Благодарю всех, кто откликнулся на помощь!
напишите  строку 31 так:
if text~=nil and string.len(text)>0 then vObj:Speak (text) end
-------------------------------
и будет Вам счастье.
 
Цитата
Николай Камынин написал:
напишите  строку 31 так:if text~=nil and string.len(text)>0 then vObj:Speak (text) end-------------------------------и будет Вам счастье.
Это не работает, проверка на нил уже была
 
надо проверять не только на нил но и длину сообщения на ноль
если мало, то добавим:
------------------
if text~=nil and string.len(text)>0 and  vObj:Speak~=nil   then vObj:Speak (text) end
 
полагаю что ошибка не связана с luacom, а вероятнее связана с неправильной работой с движком Speak
 
Цитата
Николай Камынин написал:
if text~=nil and string.len(text)>0 and  vObj:Speak~=nil   then vObj:Speak (text) end
Данная функция запускается всего из нескольких мест, и там по определению не может содержание текст быть пустым или нулевым.
И не совсем понятно, как объяснить, что при одних и тех же условиях, при запуске из одних и тех же процедур, все работает хорошо, до тех пор, пока что-то не произойдет, после чего начинает выдавать ошибку. Т.е. условия запуска одинаковые, а результат иногда происходит ошибочный.
Что конкретно лечит ситуацию, перезагрузка компа или достаточно перегрузить терминал, не выяснял.

Возможно ситуация уже решилась за счет функции pcall, во всяком случае уже теперь весь скрипт не виснет, так что ситуация перестала напрягать
 
Цитата
Sergey Denegin написал:
Цитата
Николай Камынин написал:
if text~=nil and string.len(text)>0 and  vObj:Speak~=nil   then vObj:Speak (text) end
Данная функция запускается всего из нескольких мест, и там по определению не может содержание текст быть пустым или нулевым.
И не совсем понятно, как объяснить, что при одних и тех же условиях, при запуске из одних и тех же процедур, все работает хорошо, до тех пор, пока что-то не произойдет, после чего начинает выдавать ошибку. Т.е. условия запуска одинаковые, а результат иногда происходит ошибочный.
Что конкретно лечит ситуацию, перезагрузка компа или достаточно перегрузить терминал, не выяснял.

Возможно ситуация уже решилась за счет функции pcall, во всяком случае уже теперь весь скрипт не виснет, так что ситуация перестала напрягать
проблема ваша не решилась а просто заблокировалось сообщение об ошибке
без pcall сообщение об ошибке получает система и так как нет обработки реагирует на нее зависанием
pcall перехватывает ошибку, но вы эту ошибку не обрабатываете.
Т е когда у Вас возникает ошибка эта строка просто не работает т е вы не получаете звука, но система не виснет
В таком случае зачем вам звук если вы его можете и не получить когда надо?
------------------
если хотите исправить ошибку то поставьте вывод кода завершения pcall  в lopg или печать и определите причину
Страницы: 1
Читают тему
Наверх