Денис (Автор тем)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
 
Хочу, чтобы функция OnStop() прерывала работу скрипта и выполнялась последней после нажатия кнопки "Остановить", но никак не могу этого добиться.
В штатной документации написано, что если добавить оператор return с количеством миллисекунд то это определит "время жизни" функции main() после завершения функции OnStop()

Сказано, что оператору return следует указать число.

"0" - это число? Указываю return 0

Пытаюсь запускать вот такой простенький код:

Код
Stopped = false

-- для имени файла отладки
File_Name_Log_Debugger = "Log_test_OnStop.txt"

function OnStop()      

   Stopped = true   
   File_Log_Debugger:close() -- закрывается файл отладчика   

return 0   
end                  -- конец функции обратного вызова OnStop()

function main()

-- Открывается отладочный файл лога
   File_Log_Debugger = io.open(File_Name_Log_Debugger, "w")

   while not Stopped do   
   
      if File_Log_Debugger and tostring(File_Log_Debugger) ~= "file (closed)" then
         File_Log_Debugger:write("Тестовая строка\n")
         File_Log_Debugger:flush()
      end -- end if

      sleep(1)
   end -- end while конец обработки цикла ожидания робота выход по останову   
   
end -- Конец функции main()

Иногда это работает. Но чаще всего, после нажатия кнопки "Остановить" скрипт, вроде бы, штатно останавливается - но затем через пять-семь минут при нажатии на любой пункт меню QUIK намертво зависает.

Иногда выбрасывает такую ошибку:



То есть, не смотря на указание return 0 - управление все равно возвращается в main() и там чего-то и сколько-то пытается выполняться...

Впрочем, если я пробую в функции OnStop() использовать оператор return с любым допустимым значением - то рано или поздно QUIK все-равно зависает. Без этого оператора "чудес" при остановке одинакового набора скриптов не возникает.

Смена версии Lua с 5.3.5 на 5.4.1 ничего в ситуации не меняет. QUIK от брокера ВТБ версия 9.2.3.15


Буду благодарен, если кто-нибудь поделится опытом использования в скриптах функции OnStop(), который будет чуть шире скудного описания авторов:


Цитата
Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK.

Формат вызова:

[NUMBER time_out] OnStop(NUMBER flag)

Функция возвращает количество миллисекунд, которое дается скрипту на завершение работы. Если функция не возвращает число, то таймаут завершения работы скрипта остается равным 5 секундам.

По истечении интервала времени, данного скрипту на завершение работы, функция main() завершается принудительно. При этом возможна потеря системных ресурсов.
При остановке или удалении работающего скрипта Lua из диалога управления «Доступные скрипты» параметр вызова flag принимает значение «1». При закрытии терминала QUIK – значение «2».

Особенно, вызывает недоумение фраза о принудительном завершении функции main()

Вставьте в функцию main() оператор while true do end и никакого принудительного завершения не произойдет. QUIK повиснет намертво из-за бесконечного цикла в main()
Существующее положение вещей никак нельзя назвать принудительным завершением. Это QUIK принудительно завершается из окна дисптечера задач Windows, вот это действительно принудительное завершение.
Страницы: 1
Наверх