<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: lua_error() в OnInit]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме lua_error() в OnInit форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sat, 11 Apr 2026 15:32:46 +0300</pubDate>
		<item>
			<title>lua_error() в OnInit</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message43010/topic4661/">lua_error() в OnInit</a></b> <i>Неправильное поведение</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_RX6LGYeO" href="/user/17/" bx-tooltip-user-id="17">Sergey Gorokhov</a> написал:<br />Ошибка описанная в данной ветке форума еще не исправлена, при выходе исправления здесь будет соответствующее уведомление.<br />=============<br />Это понятно, но вот поведение-то изменилось волшебным образом, на это и хотел обратить внимание. Впрочем, до 8.5 уже недолго осталось, а там поглядим, как оно все будет. <br />
			<i>25.03.2020 09:10:00, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message43010/topic4661/</link>
			<guid>http://forum.quik.ru/messages/forum10/message43010/topic4661/</guid>
			<pubDate>Wed, 25 Mar 2020 09:10:00 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>lua_error() в OnInit</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message42945/topic4661/">lua_error() в OnInit</a></b> <i>Неправильное поведение</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_4cB0D0Tq" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />Теперь (8.3.2.4) <br />=============<br />Ошибка описанная в данной ветке форума еще не исправлена, при выходе исправления здесь будет соответствующее уведомление. <br />
			<i>24.03.2020 05:23:50, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message42945/topic4661/</link>
			<guid>http://forum.quik.ru/messages/forum10/message42945/topic4661/</guid>
			<pubDate>Tue, 24 Mar 2020 05:23:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>lua_error() в OnInit</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message42895/topic4661/">lua_error() в OnInit</a></b> <i>Неправильное поведение</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Определенно, некоторые работы были проведены. Теперь (8.3.2.4) и ошибка в мейне приводит к утечке. Скрипт:<br /><br />
====code====
<pre>message("Before body")

t = newproxy(true)
mt = getmetatable(t)
mt&#91;"__gc"&#93; = function(self) message("Garbage collector") end

function OnInit()
&nbsp;&nbsp;&nbsp;message("OnInit")
end

function main()
&nbsp;&nbsp;&nbsp;message("main")
&nbsp;&nbsp;&nbsp;error "Error in main()"
end
</pre>
=============
<br />Ожидание: Before body - OnInit - main - Garbage collector. Если ошибку закомментировать, так и будет. Если оставить, то<br />Реальность: Before body - OnInit - main - ???<br />Повторный запуск: Garbage collector - Before body - OnInit - main - ???<br /><br />С нетерпением ждем новой версии луа, там ведь сразу уже нормально все будет, правда? <br />
			<i>21.03.2020 00:29:04, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message42895/topic4661/</link>
			<guid>http://forum.quik.ru/messages/forum10/message42895/topic4661/</guid>
			<pubDate>Sat, 21 Mar 2020 00:29:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>lua_error() в OnInit</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39151/topic4661/">lua_error() в OnInit</a></b> <i>Неправильное поведение</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_dYlNjA1A" href="/user/12786/" bx-tooltip-user-id="12786">Alexander Kopyatkevich</a> написал:<br />В качестве временного решения рекомендуем построить код иным образом, &nbsp;чтобы обойти эту проблему.<br />=============<br />Да, начал переписывать практически сразу, т.к. шансы на серебряную пулю были мизерные, да и хачить квик не хочется. Жаль, конечно, красивую архитектуру, try-catch -&gt; lua_error и квик нас сам выгрузит. К сожалению, &quot;иным образом&quot; -- это сильно больше кода, но кому легко.<br /><br /><br />Для товарищей в теме замечу, что в таком режиме строго try-catch-(lock-custom_unload) в колбеках и cpcall -&gt; throw во всех случаях, когда вызывается луа, единственное послабление - когда луа-функция точно не кидает ошибок, даже out of memory. Плюс можно местами извернуться, некоторые (в общем небезопасные) луа-функции ошибок не кидают при определенных условиях, например, lua_tostring не кидает, если не происходит приведения типа. Только что придется доку держать все время открытой и на каждый вызов лезть проверять, оборачивать его или обошлось, что, конечно, довольно-таки жесть. <br />
			<i>02.08.2019 13:04:54, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39151/topic4661/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39151/topic4661/</guid>
			<pubDate>Fri, 02 Aug 2019 13:04:54 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>lua_error() в OnInit</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39147/topic4661/">lua_error() в OnInit</a></b> <i>Неправильное поведение</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Здравствуйте, <a class="blog-p-user-name" id="bp_H2136f8J" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a>.<br /><br />Обнаруженная вами проблема будет исправлена в одной из очередных версий программы. <br />Приносим извинения за причиненные неудобства. <br /> <br />В качестве временного решения рекомендуем построить код иным образом, &nbsp;чтобы обойти эту проблему. <br />
			<i>02.08.2019 09:52:15, Alexander Kopyatkevich.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39147/topic4661/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39147/topic4661/</guid>
			<pubDate>Fri, 02 Aug 2019 09:52:15 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>lua_error() в OnInit</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39097/topic4661/">lua_error() в OnInit</a></b> <i>Неправильное поведение</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Здравствуйте!<br />Ваше письмо получено, проблема изучается. Постараемся в ближайшее время дать ответ. <br />
			<i>30.07.2019 10:03:02, Alexander Kopyatkevich.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39097/topic4661/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39097/topic4661/</guid>
			<pubDate>Tue, 30 Jul 2019 10:03:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>lua_error() в OnInit</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39094/topic4661/">lua_error() в OnInit</a></b> <i>Неправильное поведение</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Еще со своей стороны могу добавить.<br /><br />1. Более наглядный вариант тестового скрипта<br /><br />
====code====
<pre>sleep(1000)
message("Userdata object creation")
t = newproxy(true)
mt = getmetatable(t)
mt&#91;"__gc"&#93; = function(self) message("Hi, I'm Garbage Collector") end

function OnInit()
&nbsp;&nbsp;&nbsp;sleep(1000)
&nbsp;&nbsp;&nbsp;error "Error in OnInit"
end

function main()
&nbsp;&nbsp;&nbsp;error "Error in main()"
end
</pre>
=============
показывает, что при повторном запуске после ошибки мусор собирается сразу же, еще до пересоздания глобального объекта с финализатором. Что как бы намекает, что достаточно просто дать луа шанс доработать после ошибки, т.е. квику нужно после прибития скрипта выполнить какой-то (возможно, любой) луа-код в том же контексте. Однако,<br /><br />2. Попытался проделать это, а именно запустил перед OnInit отдельный поток, который, если через секунду ничего не произойдет, будет дергать lua_gc(context_from_on_init, LUA_GCCOLLECT, 0). Не работает. Значит, объект еще не отмечен мусорным, его кто-то держит. Дальше уже надо в кишки квика смотреть, так что мне остается перейти на сторону зрителей. <br />
			<i>29.07.2019 18:44:05, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39094/topic4661/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39094/topic4661/</guid>
			<pubDate>Mon, 29 Jul 2019 18:44:05 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>lua_error() в OnInit</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39082/topic4661/">lua_error() в OnInit</a></b> <i>Неправильное поведение</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Здравствуйте, <a class="blog-p-user-name" id="bp_Sc7vNJYE" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a>.<br /> <br /> Ваше письмо получено, проблема изучается. Постараемся в ближайшее время дать ответ. <br />
			<i>29.07.2019 11:20:45, Alexander Kopyatkevich.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39082/topic4661/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39082/topic4661/</guid>
			<pubDate>Mon, 29 Jul 2019 11:20:45 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>lua_error() в OnInit</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39077/topic4661/">lua_error() в OnInit</a></b> <i>Неправильное поведение</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Дополню. Проблема воспроизводится безо всяких длл следующим скриптом<br /><br />
====code====
<pre>t = newproxy(true)
mt = getmetatable(t)
mt&#91;"__gc"&#93; = function(self) message("Hi, I'm Garbage Collector") end

function OnInit()
&nbsp;&nbsp;&nbsp;--error "Error in OnInit"
end

function main()
&nbsp;&nbsp;&nbsp;error "Error in main()"
end</pre>
=============
<p></p>В приведенном виде после ошибки в main выводится сообщение гарбидж коллектора. Если, однако, раскомментировать генерацию ошибки в OnInit, сообщения от коллектора не будет.<br /><br />Очевидным решением было воспользоваться lua_atpanic, установив свой колбек и затем из него вызвав стандартный. Но это не работает, квик, похоже, вообще до паники не доходит, а сваливает скрипт где-то раньше своим особенным путем.<br /><br />Как говорится, какие будут предложения? Вариант &quot;будет исправлено когда-нибудь&quot; тоже хорош, но нам надо работать сегодня с, хайли лайкли, позавчерашним квиком. Если что, опыты на восьмой версии проводились. <br />
			<i>29.07.2019 04:23:22, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39077/topic4661/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39077/topic4661/</guid>
			<pubDate>Mon, 29 Jul 2019 04:23:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>lua_error() в OnInit</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message39074/topic4661/">lua_error() в OnInit</a></b> <i>Неправильное поведение</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Контекст: луа-скрипт загружает длл, все остальное делается в длл через луа-си интерфейс. В том числе создаются луа-объекты с метатаблицами и обработчиками сборки мусора (финализаторами). Наблюдаю два случая.<br /><br />1. Где-то в main() вызывается lua_error(). Все вообще здорово, main() завершается, отрабатывают финализаторы для созданных луа-объектов, длл выгружается, в окне квика с луа-скриптами выводится описание ошибки.<br /><br />2. Вызываем lua_error() в OnInit(). Скрипт также мгновенно останавливается, в окне квика с луа-скриптами появляется описание ошибки, дополнительно выводится окно сообщений с тем же описанием. Но вот внутри длл происходит адъ и израиль. Финализаторы луа-объектов не вызываются, длл остается загруженной в квик. Дальше возможны варианты:<br /><br />2.1. Если закрыть квик, длл выгружается средствами ос, естественно, ни о каких финализаторах из луа речь уже не идет.<br /><br />2.2. Если повторно запустить этот же скрипт, &quot;зависшие&quot; объекты из предыдущего экземпляра финализируются, отрабатывает вся последовательность очистки, как в случае с ошибкой в main(). Но, естественно, новый экземпляр скрипта остается &quot;недобитым&quot;.<br /><br />2.3. Если запустить какой-нибудь другой скрипт, на &quot;недобитый&quot; скрипт это никак не влияет.<br /><br />Выводы:<br /><br />1. На текущем этапе допускать lua_error() в OnInit() и, возможно, в каких-то еще колбеках (не проверял еще) не представляется возможным без сочинения костылей для принудительной очистки в случае ошибки.<br /><br />2. Разработчикам квика просьба посмотреть, что можно &quot;дернуть&quot; после ошибки в OnInit(), чтобы скрипт был &quot;добит&quot; как положено. Думается, достаточно будет гарбидж коллектор попросить собрать мусор в контексте убитого скрипта. <br />
			<i>28.07.2019 23:13:36, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message39074/topic4661/</link>
			<guid>http://forum.quik.ru/messages/forum10/message39074/topic4661/</guid>
			<pubDate>Sun, 28 Jul 2019 23:13:36 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
