<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Утечка памяти в обработчике SetTableNotificationCallback]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Утечка памяти в обработчике SetTableNotificationCallback форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 03 May 2026 11:55:31 +0300</pubDate>
		<item>
			<title>Утечка памяти в обработчике SetTableNotificationCallback</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message75218/topic8590/">Утечка памяти в обработчике SetTableNotificationCallback</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_2N8of3UN" href="/user/15203/" bx-tooltip-user-id="15203">БорисД</a> написал:<br />Николз может все таки ответишь в этой теме на вопросы заданные тебе ? &nbsp; <noindex><a href="https://forum.quik.ru/messages/forum10/message75159/topic8528/#message75159" target="_blank" rel="nofollow">https://forum.quik.ru/messages/forum10/message75159/topic8528/#message75159</a></noindex> <br /><br />А то мы все много раз читали в твоих сообщениях что ты &nbsp;доктор технических наук а каких именно даже в догадках не можем &nbsp;предположить . И про созданный тобой &nbsp;в 1975 году и &nbsp;в одиночку ИИ ( над которым по прежнему бьются все компании программистов мирового уровня ) &nbsp;признайся что это были твои враки , ну типа переборщил ты в самовосхвалении . &nbsp;Иначе дай нам посмотреть на этот твой ИИ от 1975 года выпуска. &nbsp;<br />=============<br />Мое сообщение было направлено конкретному человеку.<br />---------------------<br />Удовлетворять больное любопытство хамов нет желания. <br />
			<i>13.04.2024 11:56:01, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message75218/topic8590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message75218/topic8590/</guid>
			<pubDate>Sat, 13 Apr 2024 11:56:01 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Утечка памяти в обработчике SetTableNotificationCallback</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message75217/topic8590/">Утечка памяти в обработчике SetTableNotificationCallback</a></b> <i>Функция обратного вызова обработчика событий пользовательской таблицы не освобождает память между вызовами</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Николз может все таки ответишь в этой теме на вопросы заданные тебе ? &nbsp;<noindex><a href="https://forum.quik.ru/messages/forum10/message75159/topic8528/#message75159" target="_blank" rel="nofollow">https://forum.quik.ru/messages/forum10/message75159/topic8528/#message75159</a></noindex><br /><br />А то мы все много раз читали в твоих сообщениях что ты &nbsp;доктор технических наук а каких именно даже в догадках не можем &nbsp;предположить . И про созданный тобой &nbsp;в 1975 году и &nbsp;в одиночку ИИ ( над которым по прежнему бьются все компании программистов мирового уровня ) &nbsp;признайся что это были твои враки , ну типа переборщил ты в самовосхвалении . &nbsp;Иначе дай нам посмотреть на этот твой ИИ от 1975 года выпуска. &nbsp; <br />
			<i>12.04.2024 23:52:32, БорисД.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message75217/topic8590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message75217/topic8590/</guid>
			<pubDate>Fri, 12 Apr 2024 23:52:32 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Утечка памяти в обработчике SetTableNotificationCallback</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message75202/topic8590/">Утечка памяти в обработчике SetTableNotificationCallback</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_i1SPhenU" href="/user/15910/" bx-tooltip-user-id="15910">Serge123</a> написал:<br />У меня в связи с выносом обработки в main вопрос: напр., я хочу вынести из OnQuote разбор стакана в main, OnQuote будет вызывать getQuoteLevel2 и запоминать результат в циклический массив, а main будет брать его оттуда по текущему индексу, обрабатывать и освобождать память под эту табличку, которую получила через OnQuote от getQuoteLevel2. Не хочется использовать медленные sinsert и sremove. Можно ли сделать такую схему, чтобы не было конфликтов в связи с параллельным использованием данных между потоком main и потоком коллбэков?<br />=============<br />Синхронизируйте работу потоков с этой таблицей. &nbsp;Собственно это и сделано в функциях sinsert и sremove. <br />Чтобы функции работали быстрее, вставляйте в конец и удаляйте последний. &nbsp;<br />Но они работают быстро даже если вставлять и удалять в любое место. <br />
			<i>12.04.2024 08:41:31, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message75202/topic8590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message75202/topic8590/</guid>
			<pubDate>Fri, 12 Apr 2024 08:41:31 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Утечка памяти в обработчике SetTableNotificationCallback</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message75190/topic8590/">Утечка памяти в обработчике SetTableNotificationCallback</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_5zkchGPq" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Это тоже лучше делать в main.<br />=============<br />Мне желательно знать, когда было изменение в стакане, напр., чтобы знать, где я стою в очереди на сделки. Мне кажется, getQuoteLevel2 работает быстро, т.к. эту информацию даёт Квик, который уже получил её с сервера брокера.<br />К сожалению, квиковцы так и не сделали, чтобы можно было получать через OnQuote или хотя бы getQuoteLevel2 время с сервера биржи, в которое произошло изменение в стакане.<br /><br />А что же с моим вопросом в #7? <br />
			<i>11.04.2024 14:18:28, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message75190/topic8590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message75190/topic8590/</guid>
			<pubDate>Thu, 11 Apr 2024 14:18:28 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Утечка памяти в обработчике SetTableNotificationCallback</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message75185/topic8590/">Утечка памяти в обработчике SetTableNotificationCallback</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_3OYvqO16" href="/user/15910/" bx-tooltip-user-id="15910">Serge123</a> написал:<br />OnQuote будет вызывать getQuoteLevel2 и запоминать результат в циклический массив<br />=============<br />Это тоже лучше делать в main. Число реакций на изменение стакана может быть десятки раз в секунду. Если не стоит задача сохранить состояние стакана в каждый момент времени, то лучше разбирать стакан по событиям, когда поток скрипта дойдет до этого.<br /><br />Для примера, скрипт из сотни тысяч строк и его один цикл занимает до 1 секунды. Реагировать на изменения стакана, когда скрипт занят другим не имеет смысла, т.к. когда скрипт дойдет до разбора, его состояние изменится десятки раз. И все эти промежуточные состояния уже устарели. Но опять, если не стоит задача сохранить состояние стакана в каждый момент времени. <br />
			<i>11.04.2024 11:15:00, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message75185/topic8590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message75185/topic8590/</guid>
			<pubDate>Thu, 11 Apr 2024 11:15:00 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Утечка памяти в обработчике SetTableNotificationCallback</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message75184/topic8590/">Утечка памяти в обработчике SetTableNotificationCallback</a></b> <i>Функция обратного вызова обработчика событий пользовательской таблицы не освобождает память между вызовами</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			У меня в связи с выносом обработки в main вопрос: напр., я хочу вынести из OnQuote разбор стакана в main, OnQuote будет вызывать getQuoteLevel2 и запоминать результат в циклический массив, а main будет брать его оттуда по текущему индексу, обрабатывать и освобождать память под эту табличку, которую получила через OnQuote от getQuoteLevel2. Не хочется использовать медленные sinsert и sremove. Можно ли сделать такую схему, чтобы не было конфликтов в связи с параллельным использованием данных между потоком main и потоком коллбэков? <br />
			<i>11.04.2024 10:30:06, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message75184/topic8590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message75184/topic8590/</guid>
			<pubDate>Thu, 11 Apr 2024 10:30:06 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Утечка памяти в обработчике SetTableNotificationCallback</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message75179/topic8590/">Утечка памяти в обработчике SetTableNotificationCallback</a></b> <i>Функция обратного вызова обработчика событий пользовательской таблицы не освобождает память между вызовами</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_nHa1uuKm" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a>, <a class="blog-p-user-name" id="bp_AZeXvLQj" href="/user/16015/" bx-tooltip-user-id="16015">funduk</a>, <br /><br />Благодарю вас за ваши советы - они помогли решить проблему! <br /><br /><br /><a class="blog-p-user-name" id="bp_7wzw1pEo" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a>, я переделал скрипт как Вы порекомендовали - сделал обработчик, который только выставляет в глобальной переменной флаг, что была нажата клавиша ПРОБЕЛ:<br /><br />
====code====
<pre>function TableHandler(t_id, msg, par1, par2)
&nbsp;&nbsp; if msg == QTABLE_VKEY and par2 == 32 then bUpdate = true end&nbsp;&nbsp; 
end</pre>
=============
<br />а в функции <I>main()</I> уже тестирую этот флаг и если он <I>true </I>- соответственно вызываю функцию, которая делает все вычисления:<br /><br /><br />
====code====
<pre>function main()

&nbsp;&nbsp; while IsRun do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(Sleep_period)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if bUpdate then UpdateTableData() end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bUpdate = false

&nbsp;&nbsp; end -- while

end -- function main()</pre>
=============
<br /><br />И это помогло решить проблему - теперь в окне <B>Доступные скрипты</B> объём занятой памяти не превышает 800Кб, и главное, он не нарастает при последовательных вызовах пересчёта данных. &nbsp;<img src="http://forum.quik.ru/upload/main/smiles/5/icon_smile.png" border="0" data-code=":smile:" data-definition="SD" alt=":smile:" style="width:16px;height:16px;" title="С улыбкой" class="bx-smile" /> <br /><br /><a class="blog-p-user-name" id="bp_HVfpyDa3" href="/user/16015/" bx-tooltip-user-id="16015">funduk</a>, тоже думал уже про явные вызовы сборщика мусора, но как это не совсем идеологически верно, мне кажется. К счастью, вынос основных вычислений в поток скрипта (<I>main()</I>) благополучно решил проблему. Теперь всё работает так как и ожидалось.<br /><br />Ещё раз благодарю вас, коллеги, за внимание к вопросу и за помощь!<br /><br />Хорошего всем дня &nbsp;<img src="http://forum.quik.ru/upload/main/smiles/5/icon_cool.png" border="0" data-code=":cool:" data-definition="SD" alt=":cool:" style="width:16px;height:16px;" title="Здорово" class="bx-smile" /> ! <br />
			<i>10.04.2024 17:50:27, Роман.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message75179/topic8590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message75179/topic8590/</guid>
			<pubDate>Wed, 10 Apr 2024 17:50:27 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Утечка памяти в обработчике SetTableNotificationCallback</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message75177/topic8590/">Утечка памяти в обработчике SetTableNotificationCallback</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_teCXLw6Y" href="/user/15619/" bx-tooltip-user-id="15619">Роман</a> написал:<br />Я не совсем понял Вашу фразу &quot;это лучше не делать в колбеке, а передавать реакцию в поток скрипта&quot;. Вы имеете ввиду основную обработку делать в функции main() ? А что и как мне тогда туда передавать ? Не могли бы уточнить эту мысль?<br /><br />=============<br />Сборщик мусора не вызывается на каждый тик. Поэтому какое-то время они там останутся.<br /><br />Передать очень просто. Может прочитать примеры из руководства &quot;Использование Lua в Рабочем месте QUIK&quot;. Хотя все очевидно - в колбеке какой-то переменной, записи в очереди, присваиваете какое событие произошло, а в main обрабатываете.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_UiYw64nK" href="/user/15619/" bx-tooltip-user-id="15619">Роман</a> написал:<br />При старте скрипта один раз весь список инструментов тащить не совсем подходит - нужны конкретные инструменты, коды которых скрипт подбирает из файла<br />=============<br />Тем более лучше тогда это делать не в колбеке. При старте читаете файл, проверяете наличие инструмента и создаете необходимый список. А уже при обработке этот готовый список используете.<br />Ваш подход предполагает, что этот список изменяется и его надо постоянно обновлять. Но если это не так, то зачем каждый раз с сервера получать одни и те же данные. <br />
			<i>10.04.2024 15:07:45, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message75177/topic8590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message75177/topic8590/</guid>
			<pubDate>Wed, 10 Apr 2024 15:07:45 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Утечка памяти в обработчике SetTableNotificationCallback</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message75176/topic8590/">Утечка памяти в обработчике SetTableNotificationCallback</a></b> <i>Функция обратного вызова обработчика событий пользовательской таблицы не освобождает память между вызовами</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_7TBEyZGX" href="/user/15619/" bx-tooltip-user-id="15619">Роман</a>, если Вы вручную не зовёте сборщик мусора, он в своей манере вызывается. Может быть, ещё не пришло время по его настройкам. Попробуйте вручную вызвать. Если рост останется, тогда надо будет кумекать. <br />
			<i>10.04.2024 14:34:46, funduk.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message75176/topic8590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message75176/topic8590/</guid>
			<pubDate>Wed, 10 Apr 2024 14:34:46 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Утечка памяти в обработчике SetTableNotificationCallback</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message75174/topic8590/">Утечка памяти в обработчике SetTableNotificationCallback</a></b> <i>Функция обратного вызова обработчика событий пользовательской таблицы не освобождает память между вызовами</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_iiTFMXIh" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a>, благодарю Вас за внимание к моему вопросу. <br /><br />Я понимаю, что запрашиваю значительный объём данных, но ведь он весь сохраняется в локальных переменных колбека, которые по выходу из него должны быть освобождены и вернуты в &quot;кучу&quot;, однако почему-то этого не происходит. Автор Lua в своей книге пишет &quot;<I>Finally, a local variable </I><I>vanishes as soon as its scope ends, allowing the garbage collector to release its value.</I>&quot; Так что утечка остаётся загадкой...<br /><br />Это не первый скрипт у меня, где колбэк на таблице запрашивает данные и что-то вычисляет и в других сценариях такой проблемы нет. <br /><br />Я не совсем понял Вашу фразу &quot;это лучше не делать в колбеке, а передавать реакцию в поток скрипта&quot;. Вы имеете ввиду основную обработку делать в функции main() ? А что и как мне тогда туда передавать ? Не могли бы уточнить эту мысль?<br /><br />При старте скрипта один раз весь список инструментов тащить не совсем подходит - нужны конкретные инструменты, коды которых скрипт подбирает из файла (я тут убрал эту логику, потому что она не имеет отношения к проблеме). Просто хотел конкретно понять почему происходит memory leak при том, что все переменные локальные и должны бы освобождаться... <br />
			<i>10.04.2024 13:57:53, Роман.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message75174/topic8590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message75174/topic8590/</guid>
			<pubDate>Wed, 10 Apr 2024 13:57:53 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Утечка памяти в обработчике SetTableNotificationCallback</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message75173/topic8590/">Утечка памяти в обработчике SetTableNotificationCallback</a></b> <i>Функция обратного вызова обработчика событий пользовательской таблицы не освобождает память между вызовами</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Ничего удивительного. Вы в основном потоке терминала (в колбеке таблицы) получаете список инструментов класса SPBOPT, а потом информацию по каждому инструменту.<br />С учетом того каждый страйк опциона - это отдельный инструмент, то Вы получаете с сервера очень большой объем памяти. И так каждый раз.<br /><br />Для начала, это лучше не делать в колбеке, а передавать реакцию в поток скрипта.<br />Также лучше получить весь список инструментов один раз, при старте скрипта. А при обработке реакции идти по уже полученному списку и обновлять данные только для него. <br />
			<i>10.04.2024 13:15:51, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message75173/topic8590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message75173/topic8590/</guid>
			<pubDate>Wed, 10 Apr 2024 13:15:51 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Утечка памяти в обработчике SetTableNotificationCallback</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message75172/topic8590/">Утечка памяти в обработчике SetTableNotificationCallback</a></b> <i>Функция обратного вызова обработчика событий пользовательской таблицы не освобождает память между вызовами</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Добрый день. <br /><br />Буду признателен за помощь! <br /><br />На QLUA создаю пользовательскую табличку, на которую при помощи функции <B>SetTableNotificationCallback </B>вешаю обработчик нажатий клавиш. По нажатию <B>ПРОБЕЛ </B>обработчик должен запросить некоторые данные из таблиц <B>QUIK </B>и отобразить их в таблице. Обработчик использует только локальные переменные, которые, по идее, должны быть освобождены после выхода из обработчика, однако, если в окне (Меню <B>Сервисы -&gt; Lua скрипты... -&gt; Окно Доступные скрипты</B>) пронаблюдать динамику объёма памяти, который скрипт занимает, то видно, что при каждом нажатии пробела (т.е. при каждом вызове обработчика) объем занятой памяти только равномерно увеличивается, но никогда не освобождается. Исходник ниже, достаточно его просто <B>Copy/Paste</B> к себе, чтобы воспроизвести проблему.<br /><br /><br />
====code====
<pre>-- ************************************************
-- *&nbsp;&nbsp;&nbsp;&nbsp;Обработчик событий для таблицы&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*
-- ************************************************

function UpdateTableData(t_id, msg, par1, par2)

&nbsp;&nbsp; if msg == QTABLE_VKEY and par2 == 32 then -- нажата клавиша "Пробел", 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local records = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local i = 0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local option_class_code = "SPBOPT"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local ba_sec_code = "RIM4"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local sec_list = getClassSecurities(option_class_code)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for option_sec_code in string.gmatch(sec_list, "(&#91;%.%w&#93;+)") do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; local securityInfo = getSecurityInfo(option_class_code, option_sec_code)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if securityInfo ~= nil 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and securityInfo.base_active_seccode == ba_sec_code 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and 20240501 &#60; securityInfo.exp_date
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local sec_type = getParamEx(option_class_code, option_sec_code, "OPTIONTYPE").param_image
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if sec_type == "Put" then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = i + 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; local type_execution = getParamEx(option_class_code, option_sec_code, "OPTIONEXECTYPE").param_image
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; records&#91;i&#93; = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ba_sec_code = ba_sec_code,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;option_sec_code = option_sec_code,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;option_sec_code_full = securityInfo.name,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;option_class_code = option_class_code,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exp_date = securityInfo.exp_date,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ba_class = "SPBFUT", 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vid_option = "Американский", 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type_execution = type_execution,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;option_strike = securityInfo.option_strike,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;format = "%." .. securityInfo.scale .. "f",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end -- sec_type
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end -- if securityInfo
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end -- for option_sec_code

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- -- Now draw the table
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Clear(Tt_id) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for k,v in pairs(records) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InsertRow(Tt_id, k)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetCell(Tt_id, k, 1, v.ba_sec_code)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetCell(Tt_id, k, 2, v.ba_class)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetCell(Tt_id, k, 3, v.option_sec_code_full)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetCell(Tt_id, k, 4, v.option_sec_code)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetCell(Tt_id, k, 5, v.option_class_code)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetCell(Tt_id, k, 6, string.sub(v.exp_date , 7,8) .. "." .. string.sub(v.exp_date , 5, 6) .. "." .. string.sub(v.exp_date , 1, 4))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetCell(Tt_id, k, 7, v.vid_option)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetCell(Tt_id, k, 10, v.type_execution)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end -- for k,v 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetSelectedRow(Tt_id, 1) -- установить курсор на запись-чемпиона
&nbsp;&nbsp; end -- if&nbsp;&nbsp;msg == QTABLE_CHAR 
end -- UpdateTableData



-- *********************************************
-- *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Обарботчик запуска скрипта&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
-- *********************************************

function OnInit(script_path)

&nbsp;&nbsp; Tt_id = AllocTable()
&nbsp;&nbsp; AddColumn(Tt_id, 1, "Б.А.", true, QTABLE_STRING_TYPE, 10)
&nbsp;&nbsp; AddColumn(Tt_id, 2, "Б.А.Класс", true, QTABLE_STRING_TYPE, 15)
&nbsp;&nbsp; AddColumn(Tt_id, 3, "Код инструмента (полн.)", true, QTABLE_STRING_TYPE, 25)
&nbsp;&nbsp; AddColumn(Tt_id, 4, "Код инструмента", true, QTABLE_STRING_TYPE, 15)
&nbsp;&nbsp; AddColumn(Tt_id, 5, "Код Класса", true, QTABLE_STRING_TYPE, 10)
&nbsp;&nbsp; AddColumn(Tt_id, 6, "Погашение", true, QTABLE_DATE_TYPE, 10)
&nbsp;&nbsp; AddColumn(Tt_id, 7, "Вид опциона", true, QTABLE_STRING_TYPE, 15) -- Американский / Европейский
&nbsp;&nbsp; AddColumn(Tt_id, 8, "Тип опциона", true, QTABLE_STRING_TYPE, 5) -- Call / Put
&nbsp;&nbsp; AddColumn(Tt_id, 9, "Тип расчёта", true, QTABLE_STRING_TYPE, 15) -- Маржа / Премия
&nbsp;&nbsp; AddColumn(Tt_id, 10, "Тип исполнения", true, QTABLE_STRING_TYPE, 12) -- Поставка / Расчёт
&nbsp;&nbsp; AddColumn(Tt_id, 11, "Страйк", true, QTABLE_DOUBLE_TYPE, 12) 
&nbsp;&nbsp; AddColumn(Tt_id, 12, "Цель", true, QTABLE_DOUBLE_TYPE, 12) 
&nbsp;&nbsp; AddColumn(Tt_id, 13, "Профит, пт", true, QTABLE_INT_TYPE , 12) 
&nbsp;&nbsp; AddColumn(Tt_id, 14, "Теор. цена", true, QTABLE_DOUBLE_TYPE, 12) 
&nbsp;&nbsp; AddColumn(Tt_id, 15, "Доходность", true, QTABLE_DOUBLE_TYPE, 8) 

&nbsp;&nbsp; CreateWindow(Tt_id)

&nbsp;&nbsp; SetTableNotificationCallback(Tt_id, UpdateTableData) 

&nbsp;&nbsp; SetWindowCaption(Tt_id, "test 1.0")
&nbsp;&nbsp; SetWindowPos(Tt_id, 1, 259, 1500, 655)
&nbsp;&nbsp; InsertRow(Tt_id, -1) -- Зачем-то просят вставить эту запсиь ...
&nbsp;&nbsp; 
end -- OnInit()



-- *********************************************
-- *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Обарботчик останова скрипта&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
-- *********************************************
function OnStop()
&nbsp;&nbsp; DestroyTable(Tt_id)
&nbsp;&nbsp; Tt_id = nil
&nbsp;&nbsp; IsRun = false
end

-- *********************************************
-- *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Start running program&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*
-- *********************************************
IsRun = true

function main()
&nbsp;&nbsp; while IsRun do sleep(1000) end
end

 </pre>
=============
<p></p><p>На скрине показан объём занятой памяти в моменте. Для воспроизведения проблемы нужно несколько раз нажать ПРОБЕЛ при нахождении фокуса ввода на таблице и пронаблюдать обведённое красным кружком значение.</p><p>Оно увеличивается. </p><p>Ожидаемое поведение: последовательное нажатие ПРОБЕЛ и вызов обработчика не приводят к постоянному росту объёма занимаемой памяти.</p><p>[FILE ID=11926]<br /></p><p>Буду рад Вашим соображениям как можно решить эту проблему.</p><p></p><p>С уважением,</p><p>Роман.</p> <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=11926&" width="1511" height="634" /><br /><i>10.04.2024 12:24:25, Роман.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message75172/topic8590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message75172/topic8590/</guid>
			<pubDate>Wed, 10 Apr 2024 12:24:25 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
