Синхронизация завершения main и OnStop

Страницы: 1
RSS
Синхронизация завершения main и OnStop, требуется ли
 
Возник вопрос. Вполне вероятно он достаточно нубский, но однозначный ответ я не нагуглил и хочу для себя прояснить.
Допустим OnStop в моем сценарии выглядит как-то так:
Код
function OnStop(flag) 
  IsRun = false
  -- далее следуют какие то относительно продолжительные действия
  -- сохранение нажитого непосильным трудом по файлам например
  -- имитация таковых:
  sleep(50) 
end 
В результате main может прочитать что IsRun = false и завершиться до завершения OnStop.
Вопрос, следует ли мне всегда размещать IsRun = false в конце OnStop или можно не забивать себе такими нюансами голову?
 
И еще вопрос вдогонку. Есть событие OnClose, которое согласно описанию наступает

Цитата
Функция вызывается перед закрытием терминала QUIK и при выгрузке файла qlua.dll
Под выгрузкой файла qlua.dll подразумевается отключение плагина QLua в окне  «Версии компонентов и плагинов» (см. п. 1.9. Раздела 1 Руководства пользователя  QUIK).
У меня оно наступает только при закрытии терминала, при остановке сценария кнопкой не наступает. Окна которое бы называлось  «Версии компонентов и плагинов» я в квик 7.19.0.51 попросту не вижу, а Раздел 1 руководства пользователя квик это "подготовка к работе" и там нет никакой нумерации пунктов.
Скрипт которым тестировал (самый простой вариант):
Код
file = io.open("D:\\EventTest.log", "a+t")
IsRun = true

function WriteLog(s, ...)
    if file ~=nil then
        file:write(tostring(os.date()) .. " " .. string.format(s, unpack(arg)) .. "\n")
        file:flush()
    end
end

function OnClose()
    WriteLog("Entered OnClose")
end


function OnInit()
    WriteLog("Entered OnInit")
end

function OnStop()
    WriteLog("Entered OnStop")
    IsRun = false
end


function main()
    WriteLog("Entered Main")

    while IsRun do
        sleep(500)
    end;

    WriteLog("Leaving Main")
end
Фрагменты лога, если закрыть квик:
Код
09/30/18 07:03:50 Entered OnInit
09/30/18 07:03:50 Entered Main
09/30/18 07:03:53 Entered OnClose
09/30/18 07:03:53 Entered OnStop
09/30/18 07:03:54 Leaving Main
Если остановить скрипт кнопкой:
Код
09/30/18 07:04:00 Entered OnInit
09/30/18 07:04:00 Entered Main
09/30/18 07:04:14 Entered OnStop
09/30/18 07:04:14 Leaving Main
Для чистоты эксперимента все остальные скрипты были из квика удалены.

Итого вопрос, следует ли из этого что OnClose на самом то деле случается только при закрытии терминала, или я столкнулся с неизвестным ранее глюком, или я что-то не так понимаю в описании?
 
Дополнительный вопрос по OnClose. У меня по результатам прогона нескольких сценариев OnClose если случается то всегда до OnStop. Следует ли считать такую последовательность гарантированой? Исходя из общей логики того что они в одном потоке вроде должно быть именно так.
 
Цитата
BlackBoar написал:
У меня оно наступает только при закрытии терминала, при остановке сценария кнопкой не наступает.
Все правильно, оно и не должно так срабатывать, Вы же сами привели цитату из документации.
Окно Версии компонентов, находятся в меню Система - О программе - Компоненты
Цитата
BlackBoar написал:
Дополнительный вопрос по OnClose. У меня по результатам прогона нескольких сценариев OnClose если случается то  всегда до  OnStop. Следует ли считать такую последовательность гарантированой? Исходя из общей логики того что они в одном потоке вроде должно быть именно так.
Терминал можно закрыть по разному, например через диспетчер задач, или просто выключить компьютер. Проверьте этот момент.

Цитата
BlackBoar написал:
Вопрос, следует ли мне всегда размещать IsRun = false в конце OnStop или можно не забивать себе такими нюансами голову?
А как Вам нужно?
Если хотите чтобы OnStop был последний, верните из него таймер

Код
function OnStop(flag) 
return 10000
end 
 
Sergey Gorokhov, благодарю за разьяснения!
Sergey Gorokhov написал:

Цитата
А как Вам нужно?Если хотите чтобы OnStop был последний, верните из него таймер
Мне оно не нужно. Хотел убедиться что терминал ничего себе определенного в этом месте не подразумевает. Если терминалу все равно, просто "беру это себе на карандаш" и продолжаю заниматься своими делами ))
 
Цитата
Sergey Gorokhov написал:
Окно Версии компонентов, находятся в меню Система - О программе - Компоненты
Еще раз спасибо, нашел блудное окно ))
QLua.dll загружен хотя в терминале в котором я посмотрел точно нет луа скриптов и нет индикаторов. Насколько я понимаю этот модуль следовательно нужен чему-то еще в терминале и событие связанное с его выгрузкой без закрытия терминала и не наступит, так как-то?
Страницы: 1
Читают тему
Наверх