Подскажите, почему скрипт может не запускаться при запуске QUIK? Оставляю его включенным, перегружаю QUIK, а он не стартует. Другой скрипт в этом же QUIK успешно запускается. Нашел тему 10 летней давности, но там ответа так и не было.
Пользователь
Сообщений: Регистрация: 29.11.2018
26.09.2025 19:04:42
Поддержка QUIK не отвечает на вопросы клиентов? Где можно прочитать, как оформить скрипт, чтобы он запускался в месте с запуском QUIK?
Пользователь
Сообщений: Регистрация: 20.12.2020
26.09.2025 19:55:00
Если скрипт был запушен на на момент завершения квика, то должен запуститься. Предположу что скрипт все же запускается, но по какой-то причине сразу же завершает свою работу.
Смотрите условия завершения работы вашего скрипта. Ну и добавьте вывод отладочной инфы в скрипт чтобы проще было.
Пользователь
Сообщений: Регистрация: 29.11.2018
26.09.2025 21:04:19
Цитата
BlaZed написал: Если скрипт был запушен на на момент завершения квика, то должен запуститься. Предположу что скрипт все же запускается, но по какой-то причине сразу же завершает свою работу.
Смотрите условия завершения работы вашего скрипта. Ну и добавьте вывод отладочной инфы в скрипт чтобы проще было.
Я его сам не останавливаю. Но после запуска КВИК скрипт не запущен и даже не пытается. Скорее всего, при закрытии КВИК скрипт как-то гасится. Поэтому хотелось бы услышать комментарии от разработчиков, как правильно останавливать скрипт, чтобы он потом автозапустился.
Пользователь
Сообщений: Регистрация: 27.01.2017
27.09.2025 09:01:15
Это значит, что скрипт не завершился корректно, а был остановлен по ошибке. В таком случае скрипт не запустится сам. Проверяйте, что корректно обрабатываете колбеки OnClose, OnStop. При их вызове уже не стоит производить каких-то операций.
Пользователь
Сообщений: Регистрация: 29.11.2018
27.09.2025 16:27:15
Цитата
Nikolay написал: Это значит, что скрипт не завершился корректно, а был остановлен по ошибке. В таком случае скрипт не запустится сам. Проверяйте, что корректно обрабатываете колбеки OnClose, OnStop. При их вызове уже не стоит производить каких-то операций.
как раз он завершается корректно. ошибок никаких нет. и ключевой тут момент, что он завершается! Убрал обработку колбэков OnStop и закрытия окна бота, бота стал стартовать при запуске QUIK, но 1 раз :). Второй раз перезапустит квин не получается, он просто не стартует. Приходится перегружать Винду. Видимо придется по одному действию возвращать в обработку остановки бота и смотреть, что приводит к его закрытию. Там прилично действий, закрытие окон, файлов логов, сохранение настроек... а поддержка так и игнорирует вопросы... :(
Это-то зачем? Проверено - если в процессе ожидания OnStop возникает ошибка, то скрипт не стартует. Здесь важно учитывать, что когда скрипт останавливается (5 секунд), то main не стоит ничего делать. А также, если остановка происходит когда скрипт выполняет какую-то функцию, работает с окнами, итерирует цикл, то очень вероятно нарваться на ошибку, т.к. начинают высвобождаться объекты, те же окна скрипта. А из кода обращаемся в этот момент - получите ошибку, что объекта нет. В этом плане оборачивать функции в pcall не самая плохая практика.
Пользователь
Сообщений: Регистрация: 12.05.2020
27.09.2025 20:20:20
Цитата
Андрей написал: Видимо придется по одному действию возвращать в обработку остановки бота и смотреть, что приводит к его закрытию.
Мне пришлось столкнуться с похожей ситуацией когда в одном из скриптом стал использовать таблицы 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). Финализация выполняется при завершении скрипта по любой причине. Это делается с использованием метатаблицы финализации.
Большое спасибо за мысль! Это кажется то, что нужно. Буду сейчас пробовать. А уточните, пожалуйста, функция, которую вы упоминаете, финализирует только таблицы? открытые файлы лучше отдельно закрыть?
Пользователь
Сообщений: Регистрация: 12.05.2020
27.09.2025 21:52:32
Цитата
Андрей написал: А уточните, пожалуйста, функция, которую вы упоминаете, финализирует только таблицы? открытые файлы лучше отдельно закрыть?
У меня все объекты и таблицы и файлы финализируются следующим образом (фрагмент моего кода, обеспечивающего финализацию):
Код
--- Стек объектов финализации (автоматическая финализация) ---
-- В этот стек помещать для финализируемых объектов функции их очистки (сразу при создании объектов) в формате:
-- {<Функция финализации объекта>, {<Параметры финализации объекта через запятую>}}; таблица с параметрами может отсутствовать
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 clients support
Сообщений: Регистрация: 11.08.2025
29.09.2025 05:18:56
Здравствуйте.
Пользователи выше пишут верно: если на момент закрытия терминала QUIK скрипт запущен и работает, то при повторном запуске QUIK скрипт так же будет автоматически запущен. Возможно, проблема заключается в остановке работы скрипта в какой-то момент после его запуска.
Всю актуальную информацию по Lua вы сможете найти по этой (кликабельна).
Пользователь
Сообщений: Регистрация: 09.09.2022
30.10.2025 12:33:44
Запущен скрипт Lua. Таблиц нет, открытых файлов нет. 99.9% времени просто крутится в цикле, отслеживая состояние подключения к серверу. Имеются обработчики колбеки OnClose и OnStop, работа их сводится к тому, что они просто завершают основной цикл и скрипт завершает работу, что фиксируется отладочной информацией. При закрытии самой программы QUIK, оба колбэка срабатывают, основной цикл прерывается и скрипт выводит отладочную информацию, что он завершает работу, после чего скрипт собственно и завершает работу. Но...при повторном запуске QUIK данный скрипт стартует! Вопрос: а нахрена? Я для того и останавливал его работу, чтобы при старте QUIK скрипт не запускался!. Значит, если остановить скрипт кнопкой Остановить в окне Доступные скрипты, то он останавливается и его состояние меняется на остановленное, естественно при перезапуске QUIK он запущен не будет, а если скрипт останавливается не через кнопку, а сам по себе при включении флагов в OnClose и OnStop, то его состояние остаётся как запущенное? Зачем такое вообще? Какая разница как останолена работа крипта? Он работу завершил? Завершил! Ну так почему терминал не меняет его состояние на остановенное и перезапускает при новом запуске терминала? Ну ладно, ещё можно как-то понять, если допустим скрипт сам не завершил работу - тогда при рестарте QUIK возможно и надо запустить и скрипт, но не тогда же, когда он сам себя тормознул! Так как сделать так, чтобы при закрытии терминала скрипт не запускался, когда он сам себя корректно остановил при закрытии терминала? Или же тогда хотя бы нужно сделать, чтобы OnClose и OnStop возвращали бы флаг, который сигнализировал бы QUIK-у, а надо ли его запускать при рестарте! Т.е. указывать какое состояние сохранять для скрипта перед закрытием терминала - остановленное или запущенное.
Пользователь
Сообщений: Регистрация: 27.01.2017
30.10.2025 13:06:23
Идея, судя по всему, чтобы не бегать по скриптам при запуске терминала, которые работали в момент закрытия терминала. События же разные, одно - остановка скрипта, другое - закрытие терминала. При закрытии терминала нет ручной остановки скрипта, а значит при рестарте он будет запущен, т.к. работал.
Для тех, кто вечером выключает терминал, а утром запускает - это вполне ожидаемое, рабочее поведение.
Так что если хотите, чтобы не запускался, просто сделайте ошибку исполнения при остановке. Он тогда не стартует сам.
Пользователь
Сообщений: Регистрация: 09.09.2022
30.10.2025 13:22:34
Цитата
Nikolay написал: При закрытии терминала нет ручной остановки скрипта
Тут конечно можно поспорить. Нажимая кнопку Остановить и крестик на окне терминала, вызывается один и тот же колбэк OnStop. Так почему через кнопку состояние терминала меняется на остановленное, а через крестик нет? Ладно бы OnClose. Пусть тогда хотя бы ещё такой вариант к предложенному выше: если пользователь определил OnStop, то статус скрипта после завершения работы меняем на Остановлен, а если определён OnClose, то оставляем как Запущен. Если оба - тут подумать надо как сделать.
Цитата
Nikolay написал: Так что если хотите, чтобы не запускался, просто сделайте ошибку исполнения при остановке. Он тогда не стартует сам.
Как вариант конечно можно, но как-то топорно.
Пользователь
Сообщений: Регистрация: 09.09.2022
30.10.2025 14:18:18
Цитата
Nikolay написал: Так что если хотите, чтобы не запускался, просто сделайте ошибку исполнения при остановке. Он тогда не стартует сам.
Сделал. Не помогло! Ошибка на самом выходе ничего не меняет. Скрипт запускается! Какие ещё варианты? Могу конечно искать окно программно и нажимать кнопку Остановить программно. Но оно надо такое? Ну или там из скрипта переименовывать файл при выходе. Ну так потом надо будет руками его опять переименовывать обратно. Так что не вариант. Что разработчики скажут?
Пользователь
Сообщений: Регистрация: 09.09.2022
30.10.2025 14:22:46
Самый лучший вариант это как писал выше в том же OnClose возвращать QUIK-у флаг. Например 1 - Запускаем при рестарте скрипт. 0 - не запускаем. Или функцию какую Qlua, чтобы задавала или не задавала режим рестарта скрипта. Буду ждать ответа разработчиков.
Пользователь
Сообщений: Регистрация: 09.09.2022
30.10.2025 14:25:43
Можно ещё в файл писать, например, что вышел с помощью колбэка, а потом при старте скрипта читать файл. Но тоже как-то криво это всё. Жду разработчиков.
Пользователь
Сообщений: Регистрация: 27.01.2017
30.10.2025 15:02:04
Ошибку надо в main сделать. Разработчики скажут, что такое поведение. Методов по управлению сейчас нет и вряд ли в обозримом будущем появятся. Окно запуска скриптов до сих пор не масштабируется.
Да именно там и сделал. В самом конце main, потом уже выход из main. Не работает! Скрипт перезапускается.
Цитата
Nikolay написал: Разработчики скажут, что такое поведение.
Поведение однобокое. Не гибкое. Почему именно так, а никак иначе? Почему пользователь сам не может решить какое поведение ему нужно? Самое вообще простое это галочку ставить напротив скрипта в окне Доступные скрипты, как в QPILE было. Есть галка, скрипт запускать при старте терминала, нет - значит нет.
Цитата
Nikolay написал: Методов по управлению сейчас нет и вряд ли в обозримом будущем появятся. Окно запуска скриптов до сих пор не масштабируется.
Печально как то всё...
Пользователь
Сообщений: Регистрация: 18.12.2017
31.10.2025 01:05:57
Цитата
Alexander написал: Имеются обработчики колбеки OnClose и OnStop, работа их сводится к тому, что они просто завершают основной цикл и скрипт завершает работу, что фиксируется отладочной информацией. При закрытии самой программы QUIK, оба колбэка срабатывают, основной цикл прерывается и скрипт выводит отладочную информацию, что он завершает работу, после чего скрипт собственно и завершает работу.
Как вы определили, что OnClose срабатывает? У меня он не работает, но у меня старый Квик.