<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Обращение к DataSource в main-потоке]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Обращение к DataSource в main-потоке форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 03 May 2026 10:06:18 +0300</pubDate>
		<item>
			<title>Обращение к DataSource в main-потоке</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message29645/topic3455/">Обращение к DataSource в main-потоке</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br />Делайте через ssort, работает стабильно.<br />=============<br /><br />Спасибо за подсказку!<br /><br />Прикольно наблюдать за тем, как мы, пользователи, натыкаемся на проблемы многопоточности и решаем их, обнаруживая нетривиальные обходные пути.<br /><br />====quote====<br />хотя мне бы тоже хотелось функционала из коробки<br />=============<br /><br />Солидарен. <br />
			<i>05.03.2018 11:21:22, _sk_.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message29645/topic3455/</link>
			<guid>http://forum.quik.ru/messages/forum10/message29645/topic3455/</guid>
			<pubDate>Mon, 05 Mar 2018 11:21:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к DataSource в main-потоке</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message29644/topic3455/">Обращение к DataSource в main-потоке</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_ZQ3Ab4GE" href="/user/115/" bx-tooltip-user-id="115">_sk_</a> написал:<br />В более сложных ситуациях подобного рода проблему полностью решил бы следующий подход, когда есть возможность запуска функции в потоке коллбэков с API типа следующего:<br />=============<br />Делайте через ssort, работает стабильно.<br />Передаете в ssort таблицу на 2 элемента и заглушку которая вызывает пользовательский колбек. А там итерацию спокойно делаете любых данных. <br />разрабов в этом плане можно долго ждать, хотя мне бы тоже хотелось функционала из коробки (<noindex><a href="https://forum.quik.ru/messages/forum10/message28159/topic3225/#message28159" target="_blank" rel="nofollow">https://forum.quik.ru/messages/forum10/message28159/topic3225/#message28159</a></noindex>) <br />
			<i>05.03.2018 11:13:02, Антон.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message29644/topic3455/</link>
			<guid>http://forum.quik.ru/messages/forum10/message29644/topic3455/</guid>
			<pubDate>Mon, 05 Mar 2018 11:13:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к DataSource в main-потоке</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message29639/topic3455/">Обращение к DataSource в main-потоке</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_SFY25vJ9" href="/user/115/" bx-tooltip-user-id="115">_sk_</a> написал:<br />Вопрос в том, как добиться стабильности внутреннего состояния в main-потоке?<br />=============<br />Обработайте в цикле свечки до size-1, а, затем, оставшиеся 1 или 2 (если в процессе обработки в цикле успела закрыться текущая для начала цикла свечка) <br />
			<i>05.03.2018 10:22:19, Алексей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message29639/topic3455/</link>
			<guid>http://forum.quik.ru/messages/forum10/message29639/topic3455/</guid>
			<pubDate>Mon, 05 Mar 2018 10:22:19 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к DataSource в main-потоке</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message29636/topic3455/">Обращение к DataSource в main-потоке</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			В принципе, ничего не мешает в каждом коллбэке написать проверку типа: если очередь на выполнение, пополняемая из потока main непуста, выполнить функции из неё. У этого подхода есть недостатки:<br />1) придётся написать в каждом коллбэке строчку, вызывающую работу с очередью функций;<br />2) если рыночных коллбэков не происходит (например, торги остановились), main не получит требуемый результат, хотя поток коллбэков свободен. <br />
			<i>05.03.2018 09:35:52, _sk_.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message29636/topic3455/</link>
			<guid>http://forum.quik.ru/messages/forum10/message29636/topic3455/</guid>
			<pubDate>Mon, 05 Mar 2018 09:35:52 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к DataSource в main-потоке</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message29634/topic3455/">Обращение к DataSource в main-потоке</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Просьба к разработчикам терминала обратить внимание на это сообщение и дать свои конструктивные комментарии.<br /><br />Допустим, что у нас есть экземпляр DataSource, который содержит в себе 5-минутные свечки:
====code====
<pre>local ds = CreateDataSource(classCode, secCode, INTERVAL_M5)</pre>
=============
<br />Если ds используется в потоке коллбэков, то есть гарантия, что пока в коде коллбэка идёт работа с этим экземпляром (например, итерирование по индексу от 1 до ds:Size()), данные внутри него (количество свечей, их high, low, close, volume) не меняются.<br /><br />Вопрос в том, как добиться стабильности внутреннего состояния в main-потоке? Ведь если я запомню в переменной размер DataSource
====code====
<pre>local size = ds:Size()</pre>
=============
перед началом цикла, то в процессе итерирования могут как добавиться новые свечи, так и обновиться старые (скажем, сначала обновилась последняя свеча, а потом добавилась новая). При этом могут возникать неприятные эффекты типа в потоке main прочитали high последней свечи, потом поток коллбэков обновил свечу так, что новое значение close стало больше уже прочитанного значения high, а потом поток main увидел последнее значение close, которое больше прочитанного ранее high.<br /><br />Не уверен, что будет происходить с содержимым DataSource при смене торговой сессии, скорее всего, ничего хорошего.<br /><br />Чтобы <I>гарантированно</I> иметь консистентные данные, можно, например, использовать ds:SetUpdateCallback, в котором <I>заранее</I> производить копирование состояния ds или его изменений в другой объект, и складывать в очередь, разгребая которую из потока main до опустошения, можно всегда получить последнее консистентное состояние ds. Сейчас у меня реализован этот вариант, но кажется, что он излишне нагружает скрипт, т.к. свечки нужны в потоке main раз в 5 минут, а обновление свечей в потоке коллбэков идёт постоянно.<br /><br />Не уверен, что у меня есть 100% рабочий рецепт получения консистентных данных из DataSource в потоке main, но можно пытаться делать <I>многократное</I> чтение данных, когда параметры каждой свечи с номером i читаются до тех пор, пока не окажется, что ds:Size() не изменился и ds:T(i), ..., ds:C(i) совпадают с прочитанными ранее, после чего полагаем, что свеча i актуальна и можно переходить к следующей.<br /><br />В более сложных ситуациях подобного рода проблему полностью решил бы следующий подход, когда есть возможность запуска функции в потоке коллбэков с API типа следующего:
====code====
<pre>ExecuteCallback(function() 
&nbsp;&nbsp;-- обращение к данным ds, которое будет произведено в потоке коллбэков
end)</pre>
=============
<br />В языке программирования Java в GUI-приложениях на Swing аналогом является вызов
====code====
<pre>SwingUtilities.invokeLater(Runnable doRun)</pre>
=============
<br />Вопросы/пожелания к разработчикам:<br />1) рассмотреть возможность введения подобной возможности в терминал;<br />2) либо отказать, либо реализовать в сжатые сроки. <br />
			<i>05.03.2018 08:48:34, _sk_.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message29634/topic3455/</link>
			<guid>http://forum.quik.ru/messages/forum10/message29634/topic3455/</guid>
			<pubDate>Mon, 05 Mar 2018 08:48:34 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
