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 не завершается (чаще всего) должным образом?
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 27.01.2017
10.08.2019 10:49:37
Если под некорретным поведением подразумевается ошибка, которая здесь не указана, то предположу, что есть проблема вывода в таблицу, т.к. при остановке скрипта окно таблицы закрывается, а OnStop еще не вызван. В main нет ни одной проверки, что таблица существует и она не закрыта, вот и падает при попытке вывести в закрытую таблицу. Также sleep лучше повысить до 50 мс (т.к. используется вывод в таблицу), иначе Квик начнет процессор нагружать.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
13.08.2019 13:02:29
Под "не завершается должным образом" имеется ввиду невыполнение последнего оператора message('Exit') после нажатия кнопки "Остановить"
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 09.02.2015
QUIK software testing
13.08.2019 13:14:52
Цитата
Старатель написал: Почему после остановки скрипта main не завершается (чаще всего) должным образом?
Добрый день. Судя по содержимому функции f(), ее вызов может не завершиться за 5 секунд, которые Вы даете скрипту на корректное завершение (то значение которое возвращает функция OnStop()), если за этот таймаут поток main не успеет корректно завершиться, то интерпретатор Lua принудительно завершить этот поток.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf'
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
13.08.2019 13:30:06
Nikolay Pavlov, если вы тестируете на Pentium 100, то, возможно, так и есть. На современных компьютерах время работы функции f() менее 65 мс
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 09.02.2015
QUIK software testing
13.08.2019 13:52:16
Цитата
Старатель написал: На современных компьютерах время работы функции f() менее 65 мс
Я только предположил, что проблема в долгой работе функции f(), наверное, правильнее было ответить так, если весь код до строчки message('Exit') будет выполняться более 5 секунд, то при нажатии кнопки Стоп интерпретатор Lua подождет 5 секунд и завершит поток main принудительно, если он еще жив.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf'
Пользователь
Сообщений: Регистрация: 09.02.2015
QUIK software testing
13.08.2019 14:24:14
Изменить свой код так:
Код
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'
Пользователь
Сообщений: Регистрация: 09.02.2015
QUIK software testing
13.08.2019 14:51:24
Да, проблема похоже в другом, добавил логирование, скрипт висел 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