Кривые шибки в QLua

Страницы: 1
RSS
Кривые шибки в QLua
 
Здесь будут публиковаться кривые ошибки, возникающие, очевидно, из-за двухпоточной схемы работы QLua.
Некоторые ошибки указаны здесь: Потокобезопасные функции в Lua 5.3
 
Код
local run = true
function OnAllTrade(alltrade)
end
function OnParam(class, sec)
end
function main()
  local getinfo = debug.getinfo
  while run do
    for i = 1, 100 do
      getinfo(1)
    end
    sleep(1)
  end
end
function OnStop()
  run = nil
end

Ошибка в строке getinfo(1)
Цитата
bad argument #1 to 'getinfo' (number expected, got nil)
 
Цитата
Старатель написал:
Ошибка в строке getinfo(1)
Не воспроизвелось, работает себе и работает.
 
Никто и не обещал, что ошибка появляется всегда и сразу.
Можно запустить несколько копий скрипта, как тут, сделать перезаказ обезличенных сделок...
В общем, ошибка именно в этом коде и именно в этом месте присутствует. А как гарантированно воспроизвести - без понятия. Надо смотреть сорцы, откуда там nil.
 
Скрипт тот же, строка та же: #2
Ошибка
Цитата
attempt to call a nil value
 
Старатель, вопрос-предположение, у вас всегда параллельно со скриптами работает хоть один луа-индикатор?
 
Цитата
Anton написал:
у вас всегда параллельно со скриптами работает хоть один луа-индикатор
Если вопрос по скриптам из текущей и этой тем, то нет, в тестовом квике даже графики не открыты.
Открытые окна:
Скрытый текст
 
Цитата
Старатель написал:
в тестовом квике даже графики не открыты
Ага, спасибо. Закралась было мыслЯ, но нет )
 
Давненько я кривее ошибки не видел! Лет примерно 30-35! :)

Суть дела: написал я тестовый скрипт на Lua (чтобы разобраться, что здесь как работает - с языком до этого не сталкивался вообще). Тест заработал, я скопировал код в другой файл, уже почти "боевой", что-то там подрихтовал, запускаю - НЕ работает! Я стал сравнивать оба кода - НУ ВСЁ ТОЧНО ТАК ЖЕ! Проматерившись минут 40, я локализовал, наконец, место глюка. Из серии "не верь глазам своим". Вот полный код теста:

f=true
function main()
while f do
 sleep(5000)
end
message("Скрипт остановлен!")
end

function OnStop()
f=false
end

Как оказалось, ошибка заключается в том (я миллион раз смотрел на это место!), что в "боевом" скрипте у меня стоит sleep(15000) - ну не нужно мне чаще! А эта скотина, как оказалось, через 5 секунд после останова принудительно завершает работу, "воруя" у меня управление. Читаю документацию - там стоит:
[NUMBER time_out] OnStop(NUMBER signal)
Что за "сигнал" - покрыто мраком, и в тестовых примерах никто его не использует, равно как и возвращаемое значение: флаг сбросили - что же тут возвращать? Ан нет - "Функция возвращает количество миллисекунд, которое дается скрипту на завершение работы", а по умолчанию у неё таймаут даётся именно в те самые 5 секунд! По этим словам тоже взгляд скользит, не задерживаясь - какое может быть "время для завершения", если у меня скрипт практически ничего не делает? А вот время на "безделье", на ожидание окончания последнего "sleep" - вынь, да положь! Короче, вот исправленный код, который корректно завершается даже при 15-секундной задержке:

function OnStop()
f=false
return 20000
end

УФ! Не, сейчас-то уже смешно, но тогда!..  :smile:  
 
Здравствуйте, Старатель,

Ваше сообщение получено, проблема изучается. Постараемся в ближайшее время дать ответ.
Страницы: 1
Читают тему (гостей: 1)
Наверх