Не завершается main после остановки скрипта

Страницы: 1
RSS
Не завершается main после остановки скрипта
 
Код
local run = true

local function f()
  for i = 1, 2000000 do
    local a = 1 + 2 * 3 / 4
  end
  return run
end

function main()
  local t_id = AllocTable()
  AddColumn(t_id, 1, "", true, QTABLE_DOUBLE_TYPE, 20)
  CreateWindow(t_id)
  InsertRow(t_id, -1)
  while run do
    local r = f()
    SetCell(t_id, 1, 1, tostring(r))
    sleep(1)
  end
  message('Exit')
end

function OnStop()
  run = nil
  message('OnStop')
  return 5000
end
Почему после остановки скрипта main не завершается (чаще всего) должным образом?
Надо делать так, как надо. А как не надо - делать не надо.
 
Если под некорретным поведением подразумевается ошибка, которая здесь не указана, то предположу, что есть проблема вывода в таблицу, т.к. при остановке скрипта окно таблицы закрывается, а OnStop еще не вызван. В main нет ни одной проверки, что таблица существует и она не закрыта, вот и падает при попытке вывести в закрытую таблицу.
Также sleep лучше повысить до 50 мс (т.к. используется вывод в таблицу), иначе Квик начнет процессор нагружать.
 
Под "не завершается должным образом" имеется ввиду невыполнение последнего оператора message('Exit') после нажатия кнопки "Остановить"
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
Почему после остановки скрипта main не завершается (чаще всего) должным образом?
Добрый день.
Судя по содержимому функции f(), ее вызов может не завершиться за 5 секунд, которые Вы даете скрипту на корректное завершение (то значение которое возвращает функция OnStop()), если за этот таймаут поток main не успеет корректно завершиться, то интерпретатор Lua принудительно завершить этот поток.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
Nikolay Pavlov, если вы тестируете на Pentium 100, то, возможно, так и есть.
На современных компьютерах время работы функции f() менее 65 мс
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
На современных компьютерах время работы функции f() менее 65 мс
Я только предположил, что проблема в долгой работе функции f(), наверное, правильнее было ответить так, если весь код до строчки message('Exit') будет выполняться более 5 секунд, то при нажатии кнопки Стоп интерпретатор Lua подождет 5 секунд и завершит поток main принудительно, если он еще жив.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
Изменить свой код так:
Код
  while run do
    local r = f()
    SetCell(t_id, 1, 1, tostring(r))
    sleep(15)
  end
у меня есть предположение, что выполняя паузу в 1 мск вы забиваете очередь Windows, у которой по умолчанию стоит таймер обращения к ресурсам процессора 15.6 мск. Со sleep(15) у меня до строки message('Exit') доходит всегда.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
Да, проблема похоже в другом, добавил логирование, скрипт висел 5 секунд на строчке SetCell(t_id, 1, 1, tostring(r )):
Код
dofile(getScriptPath() .. "\\tools.lua")
local run = true

local function f()
  for i = 1, 2000000 do
    local a = 1 + 2 * 3 / 4
  end
  Log("f")
  return run
end

function OnInit(script_path)
  log_file = io.open(script_path .. ".log", "w+t")
end

function main()
  local t_id = AllocTable()
  AddColumn(t_id, 1, "", true, QTABLE_DOUBLE_TYPE, 20)
  CreateWindow(t_id)
  InsertRow(t_id, -1)
  while run do
    local r = f()
    Log("main1" .. tostring(r) .. tostring(t_id))
    SetCell(t_id, 1, 1, tostring(r))
    Log("main2" .. tostring(r))
    sleep(1)
    Log("main3" .. tostring(r))
  end
  message('Exit')
end

function OnStop()
  Log('OnStop1')
  run = nil
  Log('OnStop2')
  return 5000
end
Код
 08/13/2019 18:44:22.145387 main1true124
 08/13/2019 18:44:22.147395 main2true
 08/13/2019 18:44:22.149390 main3true
 08/13/2019 18:44:22.204382 f
 08/13/2019 18:44:22.204382 main1true124
 08/13/2019 18:44:22.220383 main2true
 08/13/2019 18:44:22.222388 main3true
 08/13/2019 18:44:22.276383 f
 08/13/2019 18:44:22.277385 main1true124
 08/13/2019 18:44:22.419389 main2true
 08/13/2019 18:44:22.421386 main3true
 08/13/2019 18:44:22.421386 OnStop1
 08/13/2019 18:44:22.421386 OnStop2
 08/13/2019 18:44:22.476385 f
 08/13/2019 18:44:22.476385 main1nil124
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
Цитата
Nikolay Pavlov написал:
скрипт висел 5 секунд на строчке SetCell(t_id, 1, 1, tostring(r ))
Так и должно быть?
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
Так и должно быть?
Добрый день.
Поведение странное, постараемся разобраться с этим. Передал коллегам, чтобы они зарегистрировали обращение по данной проблеме.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Страницы: 1
Читают тему
Наверх