Пропадает глобальная таблица _G

Страницы: 1
RSS
Пропадает глобальная таблица _G
 
QUIK 7.10.0.76. Иногда при подключении к серверу скрипт падает с ошибкой
Цитата
attempt to call global 'W' (a nil value)
W - это функция, которая крутится в цикле main. Она никак не может быть nil.
Вот фрагмент кода:
Код
function OnConnected()
  Sort = true
end
function W()
  return nil
end
function main()
  ...
  while run do
    if Sort then
      table.sort({0, 1})  -- сортировка никак не связана с функцией W, но без сортировки проблема не воспроизводится
      Sort = nil
    elseif not W() then   -- тут возникает ошибка
    else sleep(100) end
  end
end

Целый день убил на поиск проблемы, пока не заглянул в глобальную таблицу _G. А её и нет:
когда изменил код так:
Код
function main()
  while run do
    if Sort then
      table.sort({0, 1})
      Sort = nil
    else
      if not _G then message('Ahtung! Not _G', 3)
      elseif not W() then
      else sleep(100) end
    end
  end
end
то при подключении скрипт стал однократно выдавать сообщение об отсутствии _G (т.е. впоследствии _G снова обнаруживается) или падать с ошибкой
Цитата
attempt to call global 'W' (a table value)
(неожиданно!)
Скрипт использует только функции из qlua.dll, не модифицирует функцию W, и не работает напрямую с глобальной таблицей.

Соответственно, вопрос разработчикам: есть ли в QLua какие-либо механизмы, способные так повлиять на работу?
Надо делать так, как надо. А как не надо - делать не надо.
 
main начинает работать слишком быстро, похоже :)
ускорили и оптимизировали, как всегда удачно
 
Ошибка возникает не сразу после старта скрипта.
В моём случае после подключения к серверу.
Вот примерный лог работы:
Цитата
main
OnConnected
Sort
OnConnected End
Тут возникает ошибка
Вчера скрипт падал после подключения и отработки OnDepoLimit.
Что-то происходит с глобальной таблицей в колбэках.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
Ошибка возникает не сразу после старта скрипта.
В моём случае после подключения к серверу.
...
По моим наблюдениям OnConnected еще не означает, что в QUIK уже все проинициализировано. Например, время сервера после OnConnected часто бывает еще отсутствующим некоторое время..

Хорошо бы узнать от разработчиков, с какого момента уже возможна полноценная работа скриптов, может даже ввести особое событие.

И еще - потенциально возможны блуждающие ошибки из-за недостаточной синхронизации при использовании разделяемых ресурсов между основным потоком QUIK и потоком скрипта main.
Но здесь Вам виднее.

P.S. Пишу в спешке, в походных условиях, мог просто не "въехать" в ситуацию.
 
Цитата
Борис Гудылин написал:
Хорошо бы узнать от разработчиков, с какого момента уже возможна полноценная работа скриптов, может даже ввести особое событие.

Что такое "полноценная работа скриптов"?
А если Вы подключитесь к серверу за пол часа до старта торгов и чтобы отправить транзакцию Вам придется ждать пол часа, эти пол часа входит в понятие "полноценная работа скриптов"? А если час? Два? Или даже несколько дней (выходные)?
Если "да", то как мы можем назвать Вам время сколько придется ждать? Никак.
Если конкретизируете понятие "полноценная работа скриптов", возможно будет более предметный ответ.
 
Цитата
Старатель написал:
Вчера скрипт падал после подключения и отработки OnDepoLimit.

При падении, в папке dmp должен был создаться дамп процесса.
Просьба его прислать нам на изучение quiksupport@arqatech.com
 
Падает только скрипт (не терминал) с указанными выше ошибками.
Надо делать так, как надо. А как не надо - делать не надо.
 
Старатель,

У нас проблема не воспроизводится. опишите более точно последовательность действий для воспроизведения.
 
Sergey Gorokhov, на приведённом куске кода у меня проблема также не воспроизводится  :lol:
Оригинальный скрипт - это более 3 тыс. строк кода. Я попытался его уменьшить, дабы локализовать проблему. Но столкнулся с тем, что при уменьшении ниже 1500 строк ошибка не возникает. Даже удаление неиспользуемых в скрипте функций приводит к тому, что проблема не воспроизводится. Отсюда я делаю вывод, что вероятность возникновения ошибки тем выше, чем больше размер глобальной таблицы.

Вы можете подтвердить или опровергнуть?
Цитата
Старатель написал:
Что-то происходит с глобальной таблицей в колбэках.
Глобальная таблица как-то затрагивается, например для синхронизации потоков?
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
Вы можете подтвердить или опровергнуть?
боюсь что нет.
Цитата
Старатель написал:
Глобальная таблица как-то затрагивается, например для синхронизации потоков?
у нас, точно нет.
Страницы: 1
Читают тему
Наверх