Автозапуск скрипта LUA при старте QUIK

Страницы: 1
RSS
Автозапуск скрипта LUA при старте QUIK
 
Подскажите, почему скрипт может не запускаться при запуске QUIK? Оставляю его включенным, перегружаю QUIK, а он не стартует.
Другой скрипт в этом же QUIK успешно запускается.
Нашел тему 10 летней давности, но там ответа так и не было.  
 
Поддержка QUIK  не отвечает на вопросы клиентов?
Где можно прочитать, как оформить скрипт, чтобы он запускался в месте с запуском QUIK?  
 
Если скрипт был запушен на на момент завершения квика, то должен запуститься.
Предположу что скрипт все же запускается, но по какой-то причине сразу же завершает свою работу.

Смотрите условия завершения работы вашего скрипта.
Ну и добавьте вывод отладочной инфы в скрипт чтобы проще было.
 
Цитата
BlaZed написал:
Если скрипт был запушен на на момент завершения квика, то должен запуститься.
Предположу что скрипт все же запускается, но по какой-то причине сразу же завершает свою работу.

Смотрите условия завершения работы вашего скрипта.
Ну и добавьте вывод отладочной инфы в скрипт чтобы проще было.

Я его сам не останавливаю. Но после запуска КВИК скрипт не запущен и даже не пытается. Скорее всего, при закрытии КВИК скрипт как-то гасится. Поэтому хотелось бы услышать комментарии от разработчиков, как правильно останавливать скрипт, чтобы он потом автозапустился.  
 
Это значит, что скрипт не завершился корректно, а был остановлен по ошибке. В таком случае скрипт не запустится сам.
Проверяйте, что корректно обрабатываете колбеки OnClose, OnStop. При их вызове уже не стоит производить каких-то операций.
 
Цитата
Nikolay написал:
Это значит, что скрипт не завершился корректно, а был остановлен по ошибке. В таком случае скрипт не запустится сам.
Проверяйте, что корректно обрабатываете колбеки OnClose, OnStop. При их вызове уже не стоит производить каких-то операций.
как раз он завершается корректно. ошибок никаких нет. и ключевой тут момент, что он завершается! Убрал обработку колбэков OnStop и закрытия окна бота, бота стал стартовать при запуске QUIK, но 1 раз :). Второй раз перезапустит квин не получается, он просто не стартует. Приходится перегружать Винду.
Видимо придется по одному действию возвращать в обработку остановки бота и смотреть, что приводит к его закрытию. Там прилично действий, закрытие окон, файлов логов, сохранение настроек...
а поддержка так и игнорирует вопросы... :(
 
Цитата
Андрей написал:
Приходится перегружать Винду
Это-то зачем? Проверено - если в процессе ожидания OnStop возникает ошибка, то скрипт не стартует. Здесь важно учитывать, что когда скрипт останавливается (5 секунд), то main не стоит ничего делать. А также, если остановка происходит когда скрипт выполняет какую-то функцию, работает с окнами, итерирует цикл, то очень вероятно нарваться на ошибку, т.к. начинают высвобождаться объекты, те же окна скрипта. А из кода обращаемся в этот момент - получите ошибку, что объекта нет. В этом плане оборачивать функции в pcall не самая плохая практика.
 
Цитата
Андрей написал:
Видимо придется по одному действию возвращать в обработку остановки бота и смотреть, что приводит к его закрытию.
  Мне пришлось столкнуться с похожей ситуацией когда в одном из скриптом стал использовать таблицы QUIK для визуализации.
 Посмотрите в эту сторону (код завершения моего скрипта, после добавления которого он стал перезапускаться вместе с QUIK):
Код
while _RUN_ do
    < Тело основного цикла скрипта>
end
if  TBL_QUIK then  -- Если использовались таблицы
         -- Финализация (не допускать одновременного выполнения в пользовательском и основном потоке QUIK) ---
         FINALIZATION_STEK_FUNFIN(FINALIZATION_STEK, true)
         ----
         -- #### Задержка sleep нужна чтобы установить признак запуска скрипта при перезапуске QUIK. 
         -- Иначе при перезапуске QUIK не будет перезапущен скрипт.--
         -- При нормальном завершении QUIK, если есть таблицы QUIK, они удаляются (и вызываются коллбеки QTABLE_CLOSE)
         -- Если при этом нет задержки, то скрипт завершается и не выставляется признак необходимости его перезапуска
         -- при запуске QUIK. Признак TBL_QUIK  устанавливается в основной пользовательской таблице QUIK. 
         -- Длительность задержки выбрана экспериментально.
         sleep(sleep_TBL_QUIK_ or 1000) 
      end 

  FINALIZATION_STEK_FUNFIN(FINALIZATION_STEK, true) у меня  финализирует по стековому принципу все открытые объекты, которые по-хорошему, требуют своего закрытия (в том числе созданные таблицы QUIK). Финализация выполняется при завершении скрипта по любой причине. Это делается с использованием метатаблицы  финализации.
 
Цитата
TGB написал:
одном
Большое спасибо за мысль! Это кажется то, что нужно. Буду сейчас пробовать. А уточните, пожалуйста, функция, которую вы упоминаете, финализирует только таблицы? открытые файлы лучше отдельно закрыть?
 
Цитата
Андрей написал:
А уточните, пожалуйста, функция, которую вы упоминаете, финализирует только таблицы? открытые файлы лучше отдельно закрыть?
  У меня все объекты и таблицы и файлы финализируются следующим образом (фрагмент моего кода, обеспечивающего финализацию):
Код
---  Стек объектов финализации (автоматическая финализация) ---
--  В этот стек помещать для финализируемых объектов функции их очистки (сразу при создании объектов) в формате:
--    {<Функция финализации объекта>, {<Параметры финализации объекта через запятую>}};  таблица с параметрами может отсутствовать
local FINALIZATION_META
FINALIZATION_STEK = {}
--- Реализована возможность финализации "вручную":
-- 1) mess = true - финализация без выдачи сообщения;
-- 2) no_mess = 'string' - финализация c выдачи сообщения no_mess;
function FINALIZATION_STEK_FUNFIN(stek_fin, no_mess) -- ! Функция вызывается при любом варианте завершения скрипта -- 
   if type(stek_fin)  ~= 'table' then return end
   if not next(stek_fin) then return end 
   -------- Выдача сообщений различных вариантов финализации ---
   if not no_mess or type(no_mess) == 'string' then 
      -- message('FINALIZATION_STEK_FUNFIN - здесь выдать сообщение ADMIN: *** Завершение с не перехваченной ситуацией') 
      if B_Q_DLL and OPEN_CONTROL_BOT then
         local mess
         if type(no_mess) == 'string' then
            mess = no_mess
         else
            mess = '\n   *** Завершение с не перехваченной ситуацией в скрипте: ' .. (SCRIPT_NAME or '??') 
                   ..'\n  Дополнительные подробности смотрите в журнале скрипта и диагностике QUIK.'
         end
         message(mess, 3)   
         ---
      end
   end
   --------------------------------------------
   local ob_l
   for i = #stek_fin, 1, -1 do   -- обработка стека очистки объектов финализации --- 
      ob_l = stek_fin[i]   -- #### 15.12.24
      stek_fin[i] = nil    -- #### 15.12.24
      if type(ob_l)  == 'table' and type(ob_l[1]) == 'function' then    
         if ob_l[2] then
            ob_l[1](table.unpack(ob_l[2]))
         else
            ob_l[1]()
         end
      end
   end
   FINALIZATION_META.__gc= 0  -- отключение финализации ---
end
----
-- При подключении финализирующей метатаблицы в ней обязательно должно быть поле __gc  
-- (! значения отличные от функции не будут обрабатываться, но функцию можно присвоить позже), 
-- иначе не будет пометки для финализации (список финализации формируется при подключении метатаблиц с полем __gc)
FINALIZATION_META = {__gc = FINALIZATION_STEK_FUNFIN}
setmetatable(FINALIZATION_STEK, FINALIZATION_META)
---  Запись в стек функции финализации ---
function FINALIZATION_STEK_PUSH(tbl_rez)    --  tbl_rez =  {<Функция финализации объекта>, {<Параметры финализации объекта>}}
   FINALIZATION_STEK[#FINALIZATION_STEK + 1] = tbl_rez
end 

   Но, может для вас окажется достаточно добавить  sleep(1000)  или большую задержку.
 
Здравствуйте.


Пользователи выше пишут верно: если на момент закрытия терминала QUIK скрипт запущен и работает, то при повторном запуске QUIK скрипт так же будет автоматически запущен. Возможно, проблема заключается в остановке работы скрипта в какой-то момент после его запуска.

Всю актуальную информацию по Lua вы сможете найти по этой ссылке(кликабельна).
Страницы: 1
Читают тему
Наверх