<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Работа OnClose]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Работа OnClose форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Wed, 13 May 2026 14:08:42 +0300</pubDate>
		<item>
			<title>Работа OnClose</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message82462/topic9566/">Работа OnClose</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			до кучи...<br />В документации сказано:
====code====
<pre>OnClose

Функция вызывается перед закрытием терминала QUIK и при выгрузке файла 
qlua.dll. 
Формат вызова: 
OnClose()


Под выгрузкой файла qlua.dll подразумевается отключение плагина QLua в окне 
«Версии компонентов и плагинов» (см. п. 1.9. Раздела 1 Руководства пользователя 
QUIK).</pre>
=============
Но если &nbsp;работает несколько скриптов, <br />то файл qlua.dll , если это dll ,<br />не будет выгружаться, <br />если есть хотя один работающий скрипт. <br />----------------------- &nbsp;<br />Таким образом, этот колбек вызывается либо коггда терминал закрывается,<br /> либо когда останавливается последний скрипт.<br />что не так?<br /> &nbsp; <br />
			<i>12.05.2026 18:32:21, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message82462/topic9566/</link>
			<guid>http://forum.quik.ru/messages/forum10/message82462/topic9566/</guid>
			<pubDate>Tue, 12 May 2026 18:32:21 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа OnClose</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message82461/topic9566/">Работа OnClose</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Есть колбек OnClose. Казалось бы, он должен помочь понять, что терминал остановлен. Но явно что-то пошло не так.<br /><br />Берем простой скрипт. Закрываем терминал через &quot;крестик&quot;.<br /><br />Ожидание - 1. OnClose, сбрасываем флаг. 2. выходим из main. <br /><span class="bx-font" style="color:#272c31"><span class="bx-font" style="font-family:FiraCode NF, Consolas, Courier New, monospace"><span class="bx-font" style="font-size:;">
====code====
<pre>local sleep&nbsp;&nbsp;= _G.sleep
local isRun&nbsp;&nbsp;= true
local AddLabel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= _G.AddLabel
local GetLabelParams&nbsp;&nbsp;&nbsp;&nbsp;= _G.GetLabelParams
local logFile

local function log_tostring(...)
&nbsp;&nbsp;&nbsp;&nbsp;local n = select('#', ...)
&nbsp;&nbsp;&nbsp;&nbsp;if n == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;return tostring(select(1, ...))
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;local t = {}
&nbsp;&nbsp;&nbsp;&nbsp;for i = 1, n do
&nbsp;&nbsp;&nbsp;&nbsp;t&#91;#t + 1&#93; = tostring((select(i, ...)))
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;return table.concat(t, " ")
end

local function log(...)
&nbsp;&nbsp;&nbsp;&nbsp;if logFile==nil then return end
&nbsp;&nbsp;&nbsp;&nbsp;logFile:write(tostring(os.date("%c",os.time())).." "..log_tostring(...).."&#92;n");
&nbsp;&nbsp;&nbsp;&nbsp;logFile:flush();
end

function _G.OnStop()
&nbsp;&nbsp;&nbsp;&nbsp;isRun = false
&nbsp;&nbsp;&nbsp;&nbsp;log("Script Stoped")
&nbsp;&nbsp;&nbsp;&nbsp;if logFile then logFile:close() end
end

function _G.OnClose()
&nbsp;&nbsp;&nbsp;&nbsp;isRun = false
&nbsp;&nbsp;&nbsp;&nbsp;log("Script OnClose")
&nbsp;&nbsp;&nbsp;&nbsp;if logFile then logFile:close() end
end

function _G.main()

&nbsp;&nbsp;&nbsp;&nbsp;logFile = io.open(_G.getScriptPath().."&#92;&#92;labels_test.txt", "w")

&nbsp;&nbsp;&nbsp;&nbsp;local t_id = _G.AllocTable()
&nbsp;&nbsp;&nbsp;&nbsp;_G.AddColumn(t_id, 1, 'test', true, _G.QTABLE_STRING_TYPE, 20)
&nbsp;&nbsp;&nbsp;&nbsp;_G.CreateWindow(t_id)

&nbsp;&nbsp;&nbsp;&nbsp;local tag = 'virt_test'
&nbsp;&nbsp;&nbsp;&nbsp;local label_params = {}
&nbsp;&nbsp;&nbsp;&nbsp;label_params.YVALUE = 324
&nbsp;&nbsp;&nbsp;&nbsp;label_params.TEXT = 'TEST&nbsp;&nbsp;&nbsp;&nbsp;|||||||||||||||||||||||||||||||||||||||||||||'
&nbsp;&nbsp;&nbsp;&nbsp;label_params.HINT = 'Еще текст'
&nbsp;&nbsp;&nbsp;&nbsp;label_params.DATE = 20260512
&nbsp;&nbsp;&nbsp;&nbsp;label_params.TIME = 135000
&nbsp;&nbsp;&nbsp;&nbsp;label_params.FONT_FACE_NAME = 'Arial'
&nbsp;&nbsp;&nbsp;&nbsp;label_params.ALIGNMENT = 'RIGHT'
&nbsp;&nbsp;&nbsp;&nbsp;label_params.FONT_HEIGHT&nbsp;&nbsp;&nbsp;&nbsp;= 10
&nbsp;&nbsp;&nbsp;&nbsp;label_params.TRANSPARENT_BACKGROUND&nbsp;&nbsp;&nbsp;&nbsp;= 1
&nbsp;&nbsp;&nbsp;&nbsp;local data = {price = 324}
&nbsp;&nbsp;&nbsp;&nbsp;local l_id = AddLabel(tag, label_params)
&nbsp;&nbsp;&nbsp;&nbsp;sleep(1000)
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;while isRun do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local i = 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while isRun and i &#60; 10 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label_params = GetLabelParams(tag, l_id)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if label_params then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.price = tonumber(label_params.yvalue) or 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log(os.clock(), i, 'IsWindowClosed', tostring(_G.IsWindowClosed(t_id)), 'label_params', tostring(label_params), tag, 'l_id', l_id, tostring(data.price))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = i+1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log(os.clock(), 'sleep')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(100)
&nbsp;&nbsp;&nbsp;&nbsp;end
end</pre>
=============
</span></span></span><br />Выводит метку на график, создаём окно. Далее выводим данные метки с графика и закрыто ли окно. Смотрим лог:<br /><br />Tue May 12 15:07:59 2026 30.832 sleep<br />Tue May 12 15:07:59 2026 30.946 1 IsWindowClosed false label_params table: 00000205F30168A0 virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 30.947 2 IsWindowClosed false label_params table: 00000205F3016BA0 virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 30.947 3 IsWindowClosed false label_params table: 00000205F3017BA0 virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 30.947 4 IsWindowClosed false label_params table: 00000205F3017160 virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 30.947 5 IsWindowClosed false label_params table: 00000205F3018020 virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 30.947 6 IsWindowClosed false label_params table: 00000205F30171A0 virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 30.947 7 IsWindowClosed false label_params table: 00000205F30171E0 virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 30.947 8 IsWindowClosed false label_params table: 00000205F3017F20 virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 30.948 9 IsWindowClosed false label_params table: 00000205F3017A60 virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 30.948 sleep<br /><br />Окно ещё не уничтожено, но графика уже нет и данные метки не получены.<br />Tue May 12 15:07:59 2026 31.061 1 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 31.061 2 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 31.061 3 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 31.061 4 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 31.061 5 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 31.061 6 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 31.061 7 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 31.061 8 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 31.061 9 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:07:59 2026 31.061 sleep<br /><br />А здесь уже и окна нет<br />Tue May 12 15:08:00 2026 31.173 1 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:08:00 2026 31.173 2 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:08:00 2026 31.173 3 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:08:00 2026 31.173 4 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:08:00 2026 31.173 5 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:08:00 2026 31.173 6 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:08:00 2026 31.173 7 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:08:00 2026 31.173 8 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:08:00 2026 31.173 9 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0<br />Tue May 12 15:08:00 2026 31.173 sleep<br /><br />Только сейчас OnClose<br />Tue May 12 15:08:00 2026 Script OnClose<br /><br />Сама по себе схема, вроде, корректна, если бы OnClose мог выполнится параллельно, не обращая внимания на работу main. Но это не так. В итоге OnClose вызывается когда уже уничтожено окно скрипта и нет графика. Т.е. некоторое время (а точнее пока не вызовется C функция) у нас есть подвешенное состояние - мы не знаем окно, график закрыты пользователем или нет.<br />В итоге, если в это время считаем метку, а её нет, можем принять не верное решение. Аналогично и по окну скрипта.<br /><br />Что хотелось бы: вместо колбека иметь глобальный флаг, состояние или иное, сигнализирующее, что терминал закрывается. При этом он должен быть установлен быстро, перед уничтожением объектов терминала. Аналогия из электротехники - логическое 1 или 0 на контакте. Если 0, то уже всё, логика работы совершенно иная.<br /><br />Текущая же реализация может работать, если бы OnClose вызывался до уничтожения объектов. <br />
			<i>12.05.2026 15:17:50, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message82461/topic9566/</link>
			<guid>http://forum.quik.ru/messages/forum10/message82461/topic9566/</guid>
			<pubDate>Tue, 12 May 2026 15:17:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
