<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Хозяйке на заметку: OnStop()]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Хозяйке на заметку: OnStop() форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Wed, 08 Apr 2026 19:08:38 +0300</pubDate>
		<item>
			<title>Хозяйке на заметку: OnStop()</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39463/topic4686/">Хозяйке на заметку: OnStop()</a></b> <i>или &quot;Зачем вы это делаете, мистер Андерсон?&quot;</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_CAnIsaQj" href="/user/82/" bx-tooltip-user-id="82">swerg</a> написал:<br />Как известно, QLua работает вот по такой модели: &nbsp;<noindex><a href="https://quik2dde.ru/viewtopic.php?id=16" target="_blank" rel="nofollow">https://quik2dde.ru/viewtopic.php?id=16</a></noindex> <br /><br />=============<br />Спасибо, информативная штука. Кстати, Ваша диаграммка сильно помогла в свое время разобраться в порядке вызова колбеков.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_xMVm5MhE" href="/user/82/" bx-tooltip-user-id="82">swerg</a> написал:<br />Осталось лишь узнать мнение начальника транспортного цеха, зачем он использует столь изощрённый синтаксис. Какова хитрая цель? Быть может все будет полезно?<br />=============<br />Куда поедет выполнение скрипта, зависит от результатов OnInit. В частности, если оказалось, что &quot;файл настроек не найден или поврежден&quot;, то main будет с юаем, циклом сообщений и всем таким, при других условиях другая, наконец, если все прошло по &quot;основному сценарию&quot;, то вообще<br /><br />
====code====
<pre>void _on_main_regular(void * lua_state)
{
&nbsp;&nbsp;&nbsp;TRACE();
&nbsp;&nbsp;&nbsp;set_exception_handler(_on_exception);
&nbsp;&nbsp;&nbsp;_mainthread = thread::current();
&nbsp;&nbsp;&nbsp;// enable OnStop callback
&nbsp;&nbsp;&nbsp;_replace_callback(lua_state, "OnStop", ::cbid_on_stop);
&nbsp;&nbsp;&nbsp;wait::all(_stopevent, wait::infinite);
}
</pre>
============= <br />
			<i>28.08.2019 05:48:38, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39463/topic4686/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39463/topic4686/</guid>
			<pubDate>Wed, 28 Aug 2019 05:48:38 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Хозяйке на заметку: OnStop()</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39456/topic4686/">Хозяйке на заметку: OnStop()</a></b> <i>или &quot;Зачем вы это делаете, мистер Андерсон?&quot;</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Как известно, QLua работает вот по такой модели: <noindex><a href="https://quik2dde.ru/viewtopic.php?id=16" target="_blank" rel="nofollow">https://quik2dde.ru/viewtopic.php?id=16</a></noindex><br />В этой схеме не прописан один быть может не совсем очевидный нюанс, хотя понятно, что иначе и не сделать.<br /><br />Сначала выполняется &quot;скрипт целиком&quot; (&#91;BODY&#93; на схеме). Выполняется он и в том смысле, что в глобальное пространство имён Lua-машины добавляются определённые в Lua-скрипте функции.<br />Далее QLua перебирает все объекты глобального хранилища, и находит там функции с предопределёнными названиями. Для всех найденных известных функций-callback'ов &quot;в уме&quot; QLua проставляет признак: &quot;для этого события callback определён, а для этого - нет&quot;.<br /><br />После, когда возникает какое-либо событие, которое должно привести к вызову callback-функции, сначала проверяется: а для этого события с этом скрипте мы нашли требуемую callback-функцию после выполнения &#91;BODY&#93;? Нашли - вызываем её, не нашли - не вызываем.<br /><br />Соответственно, если мы в нашем Lua-скрипте определяем глобальную функцию OnStop только в тот момент, когда первый раз вызовется OnInit - то это будет уже &quot;поздно&quot;. QLua уже пометил себе, что функция OnStop - не найдена, вызывать её не следует.<br /><br />Вот и вся разгадка.<br /><br />Осталось лишь узнать мнение начальника транспортного цеха, зачем он использует столь изощрённый синтаксис. Какова хитрая цель? Быть может все будет полезно? <br />
			<i>27.08.2019 19:56:51, swerg.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39456/topic4686/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39456/topic4686/</guid>
			<pubDate>Tue, 27 Aug 2019 19:56:51 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Хозяйке на заметку: OnStop()</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39401/topic4686/">Хозяйке на заметку: OnStop()</a></b> <i>или &quot;Зачем вы это делаете, мистер Андерсон?&quot;</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_KJykcvOy" href="/user/2190/" bx-tooltip-user-id="2190">Олег</a>, да, почему-то ожидалось, что раз эти функции описаны в доке, они должны существовать на момент запуска скрипта в виде каких-то внутренних заглушек, ан нет. Ну да ничего страшного, сами заглушек наделали, делов на копейку. <br />
			<i>21.08.2019 15:52:52, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39401/topic4686/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39401/topic4686/</guid>
			<pubDate>Wed, 21 Aug 2019 15:52:52 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Хозяйке на заметку: OnStop()</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39399/topic4686/">Хозяйке на заметку: OnStop()</a></b> <i>или &quot;Зачем вы это делаете, мистер Андерсон?&quot;</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			В первом случае глобальная OnS top = nil, поэтому описанная &nbsp;OnStop является локальной по области видимости внутри OnInit.<br />Quik видит &nbsp;OnS top = nil.<br />То же самое будет и с переменными... <br />
			<i>21.08.2019 15:30:04, Олег.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39399/topic4686/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39399/topic4686/</guid>
			<pubDate>Wed, 21 Aug 2019 15:30:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Хозяйке на заметку: OnStop()</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39268/topic4686/">Хозяйке на заметку: OnStop()</a></b> <i>или &quot;Зачем вы это делаете, мистер Андерсон?&quot;</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Утро вечера мудренее. Вот так будет работать
====code====
<pre>stopflag = false

main = function()
end

OnS top = function()
end

OnI nit = function()
&nbsp;&nbsp;&nbsp;main = function()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while not stopflag do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1000)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;OnS top = function()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message("Hello, I'm OnStop")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stopflag = true
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 10000
&nbsp;&nbsp;&nbsp;end
end
</pre>
=============
Или, словами говоря, сначала создаем функции-заглушки, потом в процессе работы их можно переопределять на что угодно. Естественно, речь больше о lua_pushcclosure() / lua_setglobal(), скрипты просто иллюстрация. <br />
			<i>10.08.2019 07:31:19, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39268/topic4686/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39268/topic4686/</guid>
			<pubDate>Sat, 10 Aug 2019 07:31:19 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Хозяйке на заметку: OnStop()</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39267/topic4686/">Хозяйке на заметку: OnStop()</a></b> <i>или &quot;Зачем вы это делаете, мистер Андерсон?&quot;</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			====code====
<pre>stopflag = false

OnI nit = function()
&nbsp;&nbsp;&nbsp;OnS top = function()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message("Hello, I'm OnStop")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stopflag = true
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 10000
&nbsp;&nbsp;&nbsp;end
end

main = function()
&nbsp;&nbsp;&nbsp;while not stopflag do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1000)
&nbsp;&nbsp;&nbsp;end
end
</pre>
=============
<br />Три дня в отладчике, три раза свой код переписал, &quot;где ж я дедлок-то устроил&quot;. Ан нет, не я. Все колбеки как колбеки, OnStop почему-то кэшируется где-то до начала OnInit, так что в OnInit ее переопределять уже бесполезно. Зачем, зачем вы это делаете, мистер Андерсон?<br /><br />П.С. Тут ответа мистера Андерсона в общем-то не требуется, равно как и желать особо нечего, ну так оно вот есть и есть, жаль только, что нигде об этом не написано. Теперь написано - здесь.<br /><br />П.П.С. OnI nit, OnS top это не я так написал, это движок форума упорно поправляет. <br />
			<i>09.08.2019 23:36:37, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39267/topic4686/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39267/topic4686/</guid>
			<pubDate>Fri, 09 Aug 2019 23:36:37 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
