<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Расширить список функций обратного вызова]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Расширить список функций обратного вызова форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 03 May 2026 00:07:13 +0300</pubDate>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58239/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			1.	nikolz зачем при ссылке на мой код процитировали его весь? Он все-таки длинный и достаточно было бы привести несколько строк. У вас что, есть план по объему генерации текстов своих комментариев &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 />2.	 Это<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_cHSRnuY4" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Квант таймера 0.1 &nbsp;мкс.<br />=============<br />вы написали не случайно &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 />====quote====<br /><a class="blog-p-user-name" id="bp_WclwLsQv" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />пул событий на основе &nbsp;WaitForMultipleObjects.<br />=============<br /> Разрешение таймера в 0.1 мкс в Windows (только не путайте с возможностью засечки времени в Windows с использованием QueryPerformanceCounter) было бы круто не только для QLua, но и для C. Я, правда, не очень понимаю, зачем такое разрешение нужно в QLua, но ваша заява так впечатляет и претендует на открытие, что мне стало интересно, а вдруг вы Кулибин от программирования &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 /> &nbsp; &nbsp;Вам известно, что интервалы в WaitForMultipleObjects можно задать только в млсек.? &nbsp;Вообще, расскажите подробно в деталях, что вам известно о WaitForMultipleObjects (возможно, неизвестное мне), позволяющее, по-вашему, мнению, использовать эту функцию для обеспечения разрешения вашего гипотетического таймера в 0.1 мкс. Только не рассказывайте, это на «растопыренных» &nbsp;пальцах, а приведите нормальное API и к нему нормальный код (лучше, ваш, работающий, или хотя бы, найденный в сети) на каком-нибудь, известном вам языке программирования. Я попытаюсь такой код понять и как то его прокомментировать. <br />
			<i>29.09.2021 10:37:08, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58239/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58239/topic5983/</guid>
			<pubDate>Wed, 29 Sep 2021 10:37:08 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58213/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_FA37160l" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Реализовал &nbsp;это, создав пул событий на основе &nbsp;WaitForMultipleObjects.<br />В итоге бесконечный цикл &nbsp;запускается через заданный в функции ожидания интервал,т е это тайме собаки,либо при срабатывании любого колбека QLUA или любой функции пользователя, для которой описано событие.<br />При возникновении события запускается соответствующий ему колбек.<br />Количество событий- любое. Количество колбеков- любое. Все события &nbsp;контролируются OC.<br />Примерно так.<br />=============<br /> И это весь ваш (очень простой &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 /><br />====quote====<br /><a class="blog-p-user-name" id="bp_7KonVTuR" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Все события &nbsp;контролируются OC.<br />=============<br /> &nbsp;Ну, если бы приведенный вами «код» работал бы, то это было бы, конечно, большое достижение, особенно с учетом того, что все исполняемые приложения контролируются ОС &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 />
			<i>27.09.2021 17:23:03, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58213/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58213/topic5983/</guid>
			<pubDate>Mon, 27 Sep 2021 17:23:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58191/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_UHiQLz4T" href="/user/13952/" bx-tooltip-user-id="13952">TGB</a> написал:<br />3.<br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br />Вы может сами добавить сколько хотите функций обратного вызова.<br />=============<br /> &nbsp; Вы что, не поняли и то, что в приведенном мною примере демонстрируется возможность создания таймерных событий столько, сколько потребуется?<br />=============<br />понял, но пример у вас очень громоздкий.<br />-----------------------------------------<br />все решается гораздо проще на таймерах ожидания ядра либо событиях. <br /> При этом реакция ОС составляет не более 1 мкс.<br />===============<br />Оотносительно колбеков и одновременно таймера.<br />---------------------------<br />Реализовал &nbsp;это, создав пул событий на основе &nbsp;WaitForMultipleObjects.<br />---------------------------------<br />В итоге бесконечный цикл &nbsp;запускается через заданный в функции ожидания интервал,<br />т е это тайме собаки,<br />либо при срабатывании любого колбека QLUA <br />или любой функции пользователя, для которой описано событие.<br />-----------------------------------<br />При возникновении события запускается соответствующий ему колбек.<br />----------------------<br />Количество событий- любое<br />Количество колбеков- любое.<br />Все события &nbsp;контролируются OC.<br />================= <br />Примерно так. <br />
			<i>26.09.2021 18:15:38, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58191/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58191/topic5983/</guid>
			<pubDate>Sun, 26 Sep 2021 18:15:38 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58169/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			3.<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_TR4woTlf" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Вы может сами добавить сколько хотите функций обратного вызова.<br />=============<br /> &nbsp;Вы что, не поняли и то, что в приведенном мною примере демонстрируется возможность создания таймерных событий столько, сколько потребуется? <br />
			<i>25.09.2021 11:33:22, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58169/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58169/topic5983/</guid>
			<pubDate>Sat, 25 Sep 2021 11:33:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58164/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			1.<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_tLJsHuCt" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Попробуйте использовать таймеры ожидания (таймеры ядра)Такое решение и проще и лучше. Не надо создавать новые потоки.Квант таймера 0.1 &nbsp;мкс.Программирование гораздо проще, чем ваша скатерть-самобранка.<br />=============<br /> &nbsp;Ну. про это я, наверное, знаю.<br /> А вы попробуйте привести здесь свой работающий код и тогда поговорим.<br /><br />2. &nbsp;Тот кто соображает, поймет, что выложенный мною модуль обеспечивает возможность запускать пользователю свои функции в отдельном (от основного потока QUIK) потоке. <br />
			<i>25.09.2021 08:05:32, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58164/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58164/topic5983/</guid>
			<pubDate>Sat, 25 Sep 2021 08:05:32 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58163/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Вы может сами добавить сколько хотите функций обратного вызова. <br />
			<i>25.09.2021 07:33:30, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58163/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58163/topic5983/</guid>
			<pubDate>Sat, 25 Sep 2021 07:33:30 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58161/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_i7HWO76C" href="/user/13952/" bx-tooltip-user-id="13952">TGB</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/115/" target="_blank" rel="nofollow">_sk_</a></noindex> написал:<br />Добавить функцию обратного вызова OnTimer(), которая будет вызываться терминалом с некоторой периодичностью<br />=============<br /> <br /> &nbsp;В данном комментарии выложен модуль работы с таймерными событиями в отдельном потоке и шаблон его использования.<br />----<br />API работы с таймерными событиями:<br />1)	Start_Timer() &nbsp;- &nbsp;запуск отдельного &nbsp;потока обработки таймерных событий.<br />2)	&lt;Ключ события&gt; = Set_Timer &nbsp;(<br />{&lt;Имя события&gt;, &lt;Интервал в млсек.&gt;, &lt;Функция обработки события&gt;,{&lt;Список парвметров функции&gt;}} ) &nbsp; &nbsp;- запрос таймерного события.<br />Через &lt;Интервал в млсек.&gt; будет запущена в отдельном потоке &lt;Функция обработки события&gt; со &lt;Списоком парвметров функции&gt;.<br />3)	delete_Timer (&lt;Ключ события&gt;) – удаление при необходимости запрошенного собы-тия.<br />---- <br />Модуль и две dll (service53.dll и service54.dll) , скачанные по ссылке:<br /> <noindex><a href="https://cloud.mail.ru/public/i3Y7/kQHBvs7um" target="_blank" rel="nofollow">https://cloud.mail.ru/public/i3Y7/kQHBvs7um</a></noindex> &nbsp; необходимо положить в папку хранения info.exe.<br />---<br />Модуль OnTimer (для QLua 5.3 и 5.4):<br /> 
====code====
<pre>&nbsp;&nbsp; -- Модуль таймерных событий OnTimer --- 
&nbsp;&nbsp;&nbsp;&nbsp; -- Подключение C-пакетов service53, service54: https://cloud.mail.ru/public/i3Y7/kQHBvs7um 
 local&nbsp;&nbsp;WorkingFolder&nbsp;&nbsp;=&nbsp;&nbsp; getWorkingFolder ()&nbsp;&nbsp; 
package.cpath&nbsp;&nbsp;=&nbsp;&nbsp;package.cpath&nbsp;&nbsp;..&nbsp;&nbsp; ';'&nbsp;&nbsp; ..&nbsp;&nbsp;WorkingFolder&nbsp;&nbsp;..&nbsp;&nbsp; '&#92;&#92;?.dll'&nbsp;&nbsp; ..&nbsp;&nbsp; ';'&nbsp;&nbsp; ..&nbsp;&nbsp;WorkingFolder&nbsp;&nbsp;..&nbsp;&nbsp; '&#92;&#92;?53.dll'&nbsp;&nbsp;..&nbsp;&nbsp; ';'&nbsp;&nbsp; ..&nbsp;&nbsp;WorkingFolder&nbsp;&nbsp;..&nbsp;&nbsp; '&#92;&#92;?54.dll'&nbsp;&nbsp; ..&nbsp;&nbsp; ';'&nbsp;&nbsp; ..&nbsp;&nbsp;WorkingFolder&nbsp;&nbsp;..&nbsp;&nbsp; '&#92;&#92;?51.dll' 
&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;&nbsp;&nbsp; ..&nbsp;&nbsp; ';'&nbsp;&nbsp; ..&nbsp;&nbsp;WorkingFolder&nbsp;&nbsp;..&nbsp;&nbsp; '&#92;&#92;?3.dll'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- C - пакеты&nbsp;&nbsp;---- 
 if&nbsp;&nbsp;_VERSION&nbsp;&nbsp;=&nbsp;&nbsp;=&nbsp;&nbsp; 'Lua 5.3'&nbsp;&nbsp; then&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp; require ( 'service53' )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Подключает библиотеку service.dll, расположенную в корневом каталоге терминала QUIK (там где info.exe)&nbsp;&nbsp; ---- 
 else 
&nbsp;&nbsp;&nbsp;&nbsp; require ( 'service54' )&nbsp;&nbsp;
 end&nbsp;&nbsp;&nbsp;&nbsp;
 local&nbsp;&nbsp;GetMilliseconds, Start_thread&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp;service.GetMilliseconds, service.Start_thread

&nbsp;&nbsp; --- Функции работы с очередями&nbsp;&nbsp;--- 
&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp;new&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp; function&nbsp;&nbsp; ()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; {first&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;, last&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp; --- 
&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp;push&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp; function&nbsp;&nbsp; (self, v)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp; last&nbsp;&nbsp; =&nbsp;&nbsp; self.last&nbsp;&nbsp; +&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self&#91;last&#93;&nbsp;&nbsp; =&nbsp;&nbsp; v
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.last&nbsp;&nbsp; =&nbsp;&nbsp; last
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; last
&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp; --- 
&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp;pop&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp; function&nbsp;&nbsp; (self)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;&nbsp; first&nbsp;&nbsp; =&nbsp;&nbsp; self.first
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp; first&nbsp;&nbsp; &#62;&nbsp;&nbsp; self.last&nbsp;&nbsp; then&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp;&nbsp;&nbsp; nil&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;&nbsp; v&nbsp;&nbsp; =&nbsp;&nbsp; self &#91;first&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.first&nbsp;&nbsp; =&nbsp;&nbsp; first&nbsp;&nbsp;+&nbsp;&nbsp; 1&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self&#91;first&#93;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp; nil&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp; v, first
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;
 --------- Создание очереди ------ 
&nbsp;&nbsp;local&nbsp;&nbsp; Queue_Timer&nbsp;&nbsp;=&nbsp;&nbsp;new()&nbsp;&nbsp; --- Таймерные события ----- 
&nbsp;&nbsp;local&nbsp;&nbsp; Queue_Timer_Sl&nbsp;&nbsp;=&nbsp;&nbsp;new()&nbsp;&nbsp; --- Очередь отмены событий --- 
 ------------------------------------------- 
&nbsp;&nbsp;&nbsp;&nbsp; --- Заказ таймерных событий ---- 
&nbsp;&nbsp;&nbsp;&nbsp; --- Таймерное событие:&nbsp;&nbsp;{&#60;Имя события&#62;, &#60;Интервал в млсек.&#62;, &#60;Функция обработки события&#62;,{&#60;Список парвметров функции&#62;}} 
&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp; function&nbsp;&nbsp;Set_Timer&nbsp;&nbsp;(self)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;type(self)&nbsp;&nbsp;=&nbsp;&nbsp;=&nbsp;&nbsp; 'table'&nbsp;&nbsp; then&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp; # self&nbsp;&nbsp;&#62;&nbsp;&nbsp;=&nbsp;&nbsp; 3&nbsp;&nbsp; then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self &#91; 2 &#93;&nbsp;&nbsp;=&nbsp;&nbsp;self &#91; 2 &#93;&nbsp;&nbsp;+&nbsp;&nbsp;GetMilliseconds() 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp;push (Queue_Timer, self)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message&nbsp;&nbsp;(&nbsp;&nbsp;'!!! Ошибка. Должно быть:&nbsp;&nbsp;{&#60;Имя события&#62;, &#60;Интервал в млсек.&#62;, &#60;Функция обработки события&#62;,{&#60;Список парвметров функции&#62;}}' ) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;&nbsp;(&nbsp;&nbsp;'!!! Ошибка (параметр не таблица). Должно быть:&nbsp;&nbsp;{&#60;Имя события&#62;, &#60;Интервал в млсек.&#62;, &#60;Функция обработки события&#62;,{&#60;Список парвметров функции&#62;}}' ) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end 
&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;----- 
&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp; function&nbsp;&nbsp;delete_Timer&nbsp;&nbsp;(kl)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push (Queue_Timer_Sl, kl)
&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp; ------ 
&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp; function&nbsp;&nbsp;Timer ()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;&nbsp;ms, first_q 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;&nbsp;IsRun&nbsp;&nbsp;&nbsp;&nbsp;do&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;&nbsp;&nbsp;ms, first_q&nbsp;&nbsp;=&nbsp;&nbsp;pop (Queue_Timer_Sl) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while&nbsp;&nbsp;ms&nbsp;&nbsp; do 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;Queue_Timer &#91;ms&#93;&nbsp;&nbsp;then&nbsp;&nbsp;Queue_Timer &#91;ms&#93;&nbsp;&nbsp;=&nbsp;&nbsp; nil&nbsp;&nbsp; end 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ms, first_q&nbsp;&nbsp;=&nbsp;&nbsp;pop (Queue_Timer_Sl)&nbsp;&nbsp;&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;Чтение очереди заказанных событий&#91; -----&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for&nbsp;&nbsp;k, v&nbsp;&nbsp;in&nbsp;&nbsp;next, Queue_Timer&nbsp;&nbsp;do 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp;type(k)&nbsp;&nbsp;=&nbsp;&nbsp;=&nbsp;&nbsp; 'number'&nbsp;&nbsp; then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp;v &#91; 2 &#93;&nbsp;&nbsp;&#60;&nbsp;&nbsp;=&nbsp;&nbsp;GetMilliseconds()&nbsp;&nbsp;&nbsp;&nbsp;then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Queue_Timer &#91;k&#93;&nbsp;&nbsp;=&nbsp;&nbsp; nil 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp;v&#91; 4 &#93;&nbsp;&nbsp;then 
&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; pcall ( v&#91; 3 &#93;, table.unpack (v&#91; 4 &#93;))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pcall ( v&#91; 3 &#93;)&nbsp;&nbsp; -- функция без параметров --- 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;end 
&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;&nbsp;&nbsp; end 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;------------------------------------------------------- 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep ( 2 )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end 
&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp;&nbsp;
 --------------------------------------- 
&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp; function&nbsp;&nbsp;Start_Timer ()
&nbsp;&nbsp;&nbsp;&nbsp; Start_thread (Timer)
&nbsp;&nbsp;&nbsp;&nbsp; end 
&nbsp;&nbsp; ------ 
&nbsp;&nbsp; return&nbsp;&nbsp;{Set_Timer&nbsp;&nbsp;=&nbsp;&nbsp;Set_Timer, delete_Timer&nbsp;&nbsp;=&nbsp;&nbsp;delete_Timer, Start_Timer&nbsp;&nbsp;=&nbsp;&nbsp;Start_Timer }
&nbsp;&nbsp;</pre>
=============
 <br />---------------------------------------------<br /><br />Шаблон использования модуля:<br /> 
====code====
<pre>&nbsp;&nbsp; -- Шаблон использования модуля таймерных событий 
 local&nbsp;&nbsp;OnTi mer&nbsp;&nbsp;=&nbsp;&nbsp; require ( 'OnTimer' )&nbsp;&nbsp; -- Подключение модуля обработки таймерных событий&nbsp;&nbsp;--- 
 local&nbsp;&nbsp;Set_Timer&nbsp;&nbsp;=&nbsp;&nbsp;OnTimer.Set_Timer
 local&nbsp;&nbsp;delete_Timer&nbsp;&nbsp;=&nbsp;&nbsp;OnTimer.delete_Timer
 local&nbsp;&nbsp;Start_Timer&nbsp;&nbsp;=&nbsp;&nbsp;OnTimer.Start_Timer

IsRun&nbsp;&nbsp;=&nbsp;&nbsp; true 

&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp; function&nbsp;&nbsp;call_Timer&nbsp;&nbsp;(kl)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message&nbsp;&nbsp;(&nbsp;&nbsp;'call_Timer = '&nbsp;&nbsp; ..&nbsp;&nbsp;kl)
&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp;&nbsp;
&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp; function&nbsp;&nbsp;call_Timer1&nbsp;&nbsp;()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message&nbsp;&nbsp;(&nbsp;&nbsp;'call_Timer1&nbsp;&nbsp;() ==============' )
&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp;&nbsp;

 function&nbsp;&nbsp; main ()
&nbsp;&nbsp;&nbsp;&nbsp;Start_Timer()
&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;&nbsp;kl
&nbsp;&nbsp;&nbsp;&nbsp; --- Заказ таймерных событий ---- 
&nbsp;&nbsp;&nbsp;&nbsp; --- Таймерное событие:&nbsp;&nbsp;{&#60;Имя события&#62;, &#60;Интервал в млсек.&#62;, &#60;Функция обработки события&#62;,{&#60;Список парвметров функции&#62;}} 
&nbsp;&nbsp; kl&nbsp;&nbsp;=&nbsp;&nbsp;Set_Timer({'Set_Timer',&nbsp;&nbsp;100 , call_Timer, { 100 }})
&nbsp;&nbsp; kl&nbsp;&nbsp;=&nbsp;&nbsp;Set_Timer({'Set_Timer',&nbsp;&nbsp;1000 , call_Timer, { 1000 }})
&nbsp;&nbsp; kl&nbsp;&nbsp;=&nbsp;&nbsp;Set_Timer({'Set_Timer',&nbsp;&nbsp;5000 , call_Timer, { 5000 }})
&nbsp;&nbsp; kl&nbsp;&nbsp;=&nbsp;&nbsp;Set_Timer({'Set_Timer',&nbsp;&nbsp;3000 , call_Timer1})
 --&nbsp;&nbsp; delete_Timer (kl) 
&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp; ------------------- 
&nbsp;&nbsp;&nbsp;&nbsp; while&nbsp;&nbsp;IsRun&nbsp;&nbsp;do&nbsp;&nbsp;
&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;----&nbsp;&nbsp;Обработка в main остального ----- 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kl&nbsp;&nbsp;=&nbsp;&nbsp;Set_Timer({'Set_Timer',&nbsp;&nbsp;1000 , call_Timer, { 1000 }})
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete_Timer (kl)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;----&nbsp;&nbsp;Конец Обработка в main остального ----- 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep ( 500 )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; end 
&nbsp;&nbsp; ------------------ 
 end&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; 
 function&nbsp;&nbsp; OnStop ()
&nbsp;&nbsp;&nbsp;&nbsp; IsRun&nbsp;&nbsp;=&nbsp;&nbsp; false 
&nbsp;&nbsp;&nbsp;&nbsp; DestroyTable (TableQUIK)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DestroyTable (TableQUIK1)
&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; 10000&nbsp;&nbsp;&nbsp;&nbsp; --&nbsp;&nbsp;!!&nbsp;&nbsp;По истечении этого интервала времени (в млсек.), данного скрипту на завершение работы, функция main() завершается принудительно.&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- При этом возможна потеря системных ресурсов.&nbsp;&nbsp; ! Если функция не выдает значение, то по умолчанию оно 5000 (5 сек.) 
 end 
&nbsp;&nbsp;</pre>
=============
 <br />=============<br />Попробуйте использовать таймеры ожидания (таймеры ядра)<br />Такое решение и проще и лучше. Не надо создавать новые потоки.<br />Квант таймера 0.1 &nbsp;мкс.<br />Программирование гораздо проще, чем ваша скатерть-самобранка. <br />
			<i>25.09.2021 07:26:01, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58161/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58161/topic5983/</guid>
			<pubDate>Sat, 25 Sep 2021 07:26:01 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58160/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Извините не заметил искажения автора цитаты. В предыдущем комментарии цитата Старателя <br />
			<i>25.09.2021 00:08:09, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58160/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58160/topic5983/</guid>
			<pubDate>Sat, 25 Sep 2021 00:08:09 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58159/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Нужно ли переносить функциональность скрипта в основной поток с учетом написанного мною в предыдущем комментарии, а также с учетом цитируемого ниже?<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_3Ejzbj1o" href="/user/13952/" bx-tooltip-user-id="13952">TGB</a> написал:<br />Таблицы обслуживаются только в одном основном потоке. Доступ к данным - тоже только в одном потоке.Так что все ваши "несколько скриптов" дружно встают в очередь, как только им понадобится что-то вывести в таблицу. И включаются в общую конкурсную массу вмести с другими таблицами и графиками.<br />=============<br /> &nbsp; &nbsp;Ответ разработчика QUIK (документ «Использование Lua в Рабочем месте QUIK»):<br />«При использовании событийной модели Lua скрипт выполняется в двух потоках: функции обратного вызова выполняются в основном потоке РМ QUIK, а функция main() в до-полнительном потоке РМ QUIK (подробнее см. п. 1). При этом для предотвращения «подвисаний» РМ QUIK необходимо каким-либо образом оптимизировать сценарии, описан-ные в функциях обратного вызова. Одним из способов такой оптимизации является перенос логики обработки полученных сигналов в функцию main(). Данный подход сводит количество сценариев в функции обратного вызова до одного, а именно добавление в глобальную Lua таблицу (очередь) записи о том, что функция сработала и вернула определённые значения. Таким образом, мы получаем очередь событий, которые необходимо обработать в другом потоке.»<br />-----<br /> &nbsp; Если кому интересно, то в моем комментарии <noindex><a href="https://forum.quik.ru/messages/forum10/message57686/topic6198/#message57686" target="_blank" rel="nofollow">https://forum.quik.ru/messages/forum10/message57686/topic6198/#message57686</a></noindex> <br /> выложен код реализации модуля обработки событий колбеков и событий таблиц QUIK с использованием очередей. &nbsp;Там же приведен скрипт-шаблон подключения модуля и при-мер его использования.<br /> &nbsp;При использовании очередей проблем синхронизации нет вообще. Основной поток выполняет по событиям QUIK только короткие записи параметров колбеков в очереди, которые обрабатываются в потоке main. <br />
			<i>25.09.2021 00:04:32, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58159/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58159/topic5983/</guid>
			<pubDate>Sat, 25 Sep 2021 00:04:32 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58157/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_mhehGJ43" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br />Цитата TGB &nbsp;написал: перенос коротких задач пользователя в колбеки делает скрипт пользователя многопоточным, то есть, при этом пользователю нужно следить за тем, нет ли в &nbsp;его скрипте проблем синхронизации.<br /><br /> &nbsp;В данной ветке, наоборот, обсуждение, переноса задачи, выполняемой по таймеру, в основной поток, чтобы не заморачиваться синхронизацией:<br />Цитата _sk_ &nbsp;написал: удобно иметь возможность инициировать какой-то коллбэк из потока main, не надо думать про синхронизацию<br />=============<br /><br /> &nbsp;Из выше приведенного я понял, что о синхронизации мною было написано слишком лапидарно и не очень понятно.<br /> Попробую пояснить это более детально.<br /> &nbsp; &nbsp;Проблемы синхронизации возникают, только в случае, если у двух или более потоков есть общие модифицируемые при обработке данные. Поэтому при обработке колбеков, до тех пор, пока в main есть только цикл со sleep, то синхронизацией можно не озадачиваться. Но как только, после очередного внесения изменений &nbsp;в скрип, появятся общие для функций колбеков и функций main модифицируемые данные, с синхронизацией следует разбираться. Причем, &nbsp;проблемы синхронизации возникают не в отдельных потоках, а при их взаимодействии.<br /> &nbsp; &nbsp;Конечно, можно всю функциональность скрипта перенести в основной (единственный) поток QUIK и не будет никаких проблем с синхронизацией. Надо только следить за тем, чтобы при изменении скрипта не появились общие (для main и основного потокаQUIK) модифицируемые данные. <br />
			<i>24.09.2021 19:21:24, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58157/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58157/topic5983/</guid>
			<pubDate>Fri, 24 Sep 2021 19:21:24 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58154/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_DcxBBCKf" href="/user/13952/" bx-tooltip-user-id="13952">TGB</a> написал:<br />использование основного потока для выполнения функций пользователя параллелизм &nbsp;добавляет только при выполнении C-функций;<br />=============<br />На "параллелизм" я и <noindex><a href="https://forum.quik.ru/messages/forum10/message47248/topic2200/#message47248" target="_blank" rel="nofollow">не рассчитываю</a></noindex>.<br /><br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_1KIwPXmY" href="/user/13952/" bx-tooltip-user-id="13952">TGB</a> написал:<br />если у пользователя запущено несколько скриптов, то пока основной поток QUIK выполняется в одном из скриптов, он перестает обслуживать другие скрипты пользователя (в том числе, и созданные им таблицы QUIK)<br />=============<br />Таблицы обслуживаются только в одном основном потоке. Доступ к данным - тоже только в одном потоке.<br />Так что все ваши "несколько скриптов" дружно встают в очередь, как только им понадобится что-то вывести в таблицу. И включаются в общую конкурсную массу вмести с другими таблицами и графиками.<br /><br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_q3Zx4eNw" href="/user/13952/" bx-tooltip-user-id="13952">TGB</a> написал:<br />перенос коротких задач пользователя в колбеки делает скрипт пользователя многопоточным, то есть, при этом пользователю нужно следить за тем, нет ли в &nbsp;его скрипте проблем синхронизации<br />=============<br /><br />В данной ветке, наоборот, обсуждение, переноса задачи, выполняемой по таймеру, в основной поток, чтобы не заморачиваться синхронизацией:<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_tDi8zS2X" href="/user/115/" bx-tooltip-user-id="115">_sk_</a> написал:<br />удобно иметь возможность инициировать какой-то коллбэк из потока main, не надо думать про синхронизацию<br />=============<br /> <br />
			<i>24.09.2021 16:48:44, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58154/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58154/topic5983/</guid>
			<pubDate>Fri, 24 Sep 2021 16:48:44 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58123/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_I2lk2AWN" href="/user/115/" bx-tooltip-user-id="115">_sk_</a> написал:<br />Добавить функцию обратного вызова OnTimer(), которая будет вызываться терминалом с некоторой периодичностью<br />=============<br /><br /> &nbsp;В данном комментарии выложен модуль работы с таймерными событиями в отдельном потоке и шаблон его использования.<br />----<br />API работы с таймерными событиями:<br />1)	Start_Timer() &nbsp;- &nbsp;запуск отдельного &nbsp;потока обработки таймерных событий.<br />2)	&lt;Ключ события&gt; = Set_Timer &nbsp;(<br />{&lt;Имя события&gt;, &lt;Интервал в млсек.&gt;, &lt;Функция обработки события&gt;,{&lt;Список парвметров функции&gt;}} ) &nbsp; &nbsp;- запрос таймерного события.<br />Через &lt;Интервал в млсек.&gt; будет запущена в отдельном потоке &lt;Функция обработки события&gt; со &lt;Списоком парвметров функции&gt;.<br />3)	delete_Timer (&lt;Ключ события&gt;) – удаление при необходимости запрошенного собы-тия.<br />---- <br />Модуль и две dll (service53.dll и service54.dll) , скачанные по ссылке:<br /><noindex><a href="https://cloud.mail.ru/public/i3Y7/kQHBvs7um" target="_blank" rel="nofollow">https://cloud.mail.ru/public/i3Y7/kQHBvs7um</a></noindex> &nbsp;необходимо положить в папку хранения info.exe.<br />---<br />Модуль OnTimer (для QLua 5.3 и 5.4):<br />
====code====
<pre>
-- Модуль таймерных событий OnTimer ---
&nbsp;&nbsp;&nbsp;&nbsp;-- Подключение C-пакетов service53, service54: https://cloud.mail.ru/public/i3Y7/kQHBvs7um
local WorkingFolder = getWorkingFolder()&nbsp;&nbsp;&nbsp;
package.cpath = package.cpath .. ';' .. WorkingFolder .. '&#92;&#92;?.dll' .. ';' .. WorkingFolder .. '&#92;&#92;?53.dll'.. ';' .. WorkingFolder .. '&#92;&#92;?54.dll' .. ';' .. WorkingFolder .. '&#92;&#92;?51.dll'
&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;&nbsp; .. ';' .. WorkingFolder .. '&#92;&#92;?3.dll'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- C - пакеты&nbsp;&nbsp;----
if _VERSION == 'Lua 5.3' then&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;require('service53')&nbsp;&nbsp;&nbsp;&nbsp; -- Подключает библиотеку service.dll, расположенную в корневом каталоге терминала QUIK (там где info.exe)&nbsp;&nbsp; ----
else
&nbsp;&nbsp;&nbsp;&nbsp;require('service54')&nbsp;&nbsp;
end&nbsp;&nbsp;&nbsp;
local GetMilliseconds, Start_thread&nbsp;&nbsp;=&nbsp;&nbsp; service.GetMilliseconds, service.Start_thread

&nbsp;&nbsp;--- Функции работы с очередями&nbsp;&nbsp;---
&nbsp;&nbsp;&nbsp;&nbsp;local new&nbsp;&nbsp;=&nbsp;&nbsp; function&nbsp;&nbsp;()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;{first&nbsp;&nbsp;=&nbsp;&nbsp; 1 , last&nbsp;&nbsp;=&nbsp;&nbsp; 0 }
&nbsp;&nbsp;&nbsp;&nbsp;end 
&nbsp;&nbsp;&nbsp; ---
&nbsp;&nbsp;&nbsp;&nbsp;local push&nbsp;&nbsp;=&nbsp;&nbsp; function&nbsp;&nbsp;(self, v)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;&nbsp;last&nbsp;&nbsp;=&nbsp;&nbsp;self.last&nbsp;&nbsp;+&nbsp;&nbsp;1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self&#91;last&#93;&nbsp;&nbsp;=&nbsp;&nbsp;v
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.last&nbsp;&nbsp;=&nbsp;&nbsp;last
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;last
&nbsp;&nbsp;&nbsp;&nbsp;end 
&nbsp;&nbsp;&nbsp; ---
&nbsp;&nbsp;&nbsp;&nbsp;local pop&nbsp;&nbsp;=&nbsp;&nbsp; function&nbsp;&nbsp;(self)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp;first&nbsp;&nbsp;=&nbsp;&nbsp;self.first
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp;first&nbsp;&nbsp;&#62;&nbsp;&nbsp;self.last&nbsp;&nbsp;then&nbsp;&nbsp; return&nbsp;&nbsp; nil&nbsp;&nbsp; end 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp;v&nbsp;&nbsp;=&nbsp;&nbsp;self &#91;first&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.first&nbsp;&nbsp;=&nbsp;&nbsp;first + 1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self&#91;first&#93;&nbsp;&nbsp;=&nbsp;&nbsp; nil 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp;v, first
&nbsp;&nbsp;&nbsp;&nbsp; end 
--------- Создание очереди ------
 local&nbsp;&nbsp;Queue_Timer = new()&nbsp;&nbsp;--- Таймерные события -----
 local&nbsp;&nbsp;Queue_Timer_Sl = new()&nbsp;&nbsp;--- Очередь отмены событий ---
-------------------------------------------
&nbsp;&nbsp;&nbsp;&nbsp;--- Заказ таймерных событий ----
&nbsp;&nbsp;&nbsp;&nbsp;--- Таймерное событие:&nbsp;&nbsp;{&#60;Имя события&#62;, &#60;Интервал в млсек.&#62;, &#60;Функция обработки события&#62;,{&#60;Список парвметров функции&#62;}}
&nbsp;&nbsp;&nbsp;&nbsp;local function Set_Timer&nbsp;&nbsp;(self)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if type(self) == 'table' then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if #self &#62;= 3 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self &#91;2&#93; = self &#91;2&#93; + GetMilliseconds() 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return push (Queue_Timer, self)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message ( '!!! Ошибка. Должно быть:&nbsp;&nbsp;{&#60;Имя события&#62;, &#60;Интервал в млсек.&#62;, &#60;Функция обработки события&#62;,{&#60;Список парвметров функции&#62;}}') 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message ( '!!! Ошибка (параметр не таблица). Должно быть:&nbsp;&nbsp;{&#60;Имя события&#62;, &#60;Интервал в млсек.&#62;, &#60;Функция обработки события&#62;,{&#60;Список парвметров функции&#62;}}') 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;end 
&nbsp;&nbsp;&nbsp;-----
&nbsp;&nbsp;&nbsp;&nbsp;local function delete_Timer&nbsp;&nbsp;(kl)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push (Queue_Timer_Sl, kl)
&nbsp;&nbsp;&nbsp;&nbsp;end 
&nbsp;&nbsp;&nbsp;&nbsp;------
&nbsp;&nbsp;&nbsp;&nbsp;local function Timer ()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local ms, first_q 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while IsRun&nbsp;&nbsp; do 
&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;ms, first_q = pop (Queue_Timer_Sl) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while ms&nbsp;&nbsp;do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if Queue_Timer &#91;ms&#93; then Queue_Timer &#91;ms&#93; = nil end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ms, first_q = pop (Queue_Timer_Sl)&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;---&nbsp;&nbsp;Чтение очереди заказанных событий&#91; -----&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for k, v in next, Queue_Timer do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if type(k) == 'number' then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if v &#91;2&#93; &#60;= GetMilliseconds()&nbsp;&nbsp; then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue_Timer &#91;k&#93; = nil
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if v&#91;4&#93; then
&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; pcall ( v&#91;3&#93;, table.unpack (v&#91;4&#93;))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pcall ( v&#91;3&#93;)&nbsp;&nbsp;-- функция без параметров ---
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;end
&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;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-------------------------------------------------------
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;end 
---------------------------------------
&nbsp;&nbsp;&nbsp;&nbsp;local function Start_Timer ()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Start_thread (Timer)
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;------
&nbsp;&nbsp;return {Set_Timer = Set_Timer, delete_Timer = delete_Timer, Start_Timer = Start_Timer }
</pre>
=============
<br />---------------------------------------------<br /><br />Шаблон использования модуля:<br />
====code====
<pre>
-- Шаблон использования модуля таймерных событий
local OnTi mer = require('OnTimer')&nbsp;&nbsp;-- Подключение модуля обработки таймерных событий&nbsp;&nbsp;---
local Set_Timer = OnTimer.Set_Timer
local delete_Timer = OnTimer.delete_Timer
local Start_Timer = OnTimer.Start_Timer

IsRun = true

&nbsp;&nbsp;&nbsp;&nbsp;local function call_Timer&nbsp;&nbsp;(kl)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message ( 'call_Timer = ' .. kl)
&nbsp;&nbsp;&nbsp;&nbsp;end 
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;local function call_Timer1&nbsp;&nbsp;()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message ( 'call_Timer1&nbsp;&nbsp;() ==============')
&nbsp;&nbsp;&nbsp;&nbsp;end 

function main()
&nbsp;&nbsp;&nbsp;&nbsp;Start_Timer()
&nbsp;&nbsp;&nbsp;local kl
&nbsp;&nbsp;&nbsp;&nbsp;--- Заказ таймерных событий ----
&nbsp;&nbsp;&nbsp;&nbsp;--- Таймерное событие:&nbsp;&nbsp;{&#60;Имя события&#62;, &#60;Интервал в млсек.&#62;, &#60;Функция обработки события&#62;,{&#60;Список парвметров функции&#62;}}
&nbsp;&nbsp;&nbsp;kl = Set_Timer({'Set_Timer', 100, call_Timer, {100}})
&nbsp;&nbsp;&nbsp;kl = Set_Timer({'Set_Timer', 1000, call_Timer, {1000}})
&nbsp;&nbsp;&nbsp;kl = Set_Timer({'Set_Timer', 5000, call_Timer, {5000}})
&nbsp;&nbsp;&nbsp;kl = Set_Timer({'Set_Timer', 3000, call_Timer1})
--&nbsp;&nbsp;&nbsp;delete_Timer (kl)
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;-------------------
&nbsp;&nbsp;&nbsp;&nbsp;while IsRun do 
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;----&nbsp;&nbsp;Обработка в main остального -----
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kl = Set_Timer({'Set_Timer', 1000, call_Timer, {1000}})
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete_Timer (kl)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;----&nbsp;&nbsp;Конец Обработка в main остального -----
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(500)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;end
&nbsp;&nbsp;------------------
end&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;
function OnStop()
&nbsp;&nbsp;&nbsp;&nbsp; IsRun = false
&nbsp;&nbsp;&nbsp; DestroyTable(TableQUIK)
&nbsp;&nbsp;&nbsp;&nbsp; DestroyTable(TableQUIK1)
&nbsp;&nbsp;&nbsp; return 10000&nbsp;&nbsp; --&nbsp;&nbsp;!!&nbsp;&nbsp;По истечении этого интервала времени (в млсек.), данного скрипту на завершение работы, функция main() завершается принудительно. 
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- При этом возможна потеря системных ресурсов.&nbsp;&nbsp; ! Если функция не выдает значение, то по умолчанию оно 5000 (5 сек.)
end
</pre>
============= <br />
			<i>22.09.2021 23:35:20, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58123/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58123/topic5983/</guid>
			<pubDate>Wed, 22 Sep 2021 23:35:20 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58101/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_hKA3M9ps" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br />Кто сказал "нагружать"? Задачи на 0.1-2 мс, без фанатизма.Я даже не понимаю тех, кто в стремлении "разгрузить" основной поток перекидывает простейшие задачи (с временем выполнения менее 2 мс) из колбеков в main (что опять же не бесплатно в плане нагрузки), создавая километровые очереди и забывая об общей производительности.<br />=============<br /> &nbsp;С написанным можно бы согласиться, но с учетом следующих моментов:<br />1)	байт-коды основного потока QUIK и пользовательского потока main выполняются последовательно и пока выполняется один, другой ждет; &nbsp;то есть использование основного потока для выполнения функций пользователя параллелизм &nbsp;добавляет только при выполнении C-функций; <br />2)	если у пользователя запущено несколько скриптов, то пока основной поток QUIK выполняется в одном из скриптов, он перестает обслуживать другие скрипты пользователя (в том числе, и созданные им таблицы QUIK);<br />3)	 вами выложены в ветке «Кривые ошибки в QLUA» очень эффективные потокобезопасные функции работы с очередями &nbsp;без синхронизации между основным потоком QUIK и потоком main;<br />4)	перенос коротких задач пользователя в колбеки делает скрипт пользователя многопоточным, то есть, при этом пользователю нужно следить за тем, нет ли в &nbsp;его скрипте проблем синхронизации. <br />
			<i>21.09.2021 22:02:41, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58101/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58101/topic5983/</guid>
			<pubDate>Tue, 21 Sep 2021 22:02:41 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58096/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_FXf0C7Dl" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br />Хотелось бы что-то типа такого &quot;из коробки&quot; без необходимости дёргать GUI.<br />=============<br />Об чем вся и ветка. Так-то задача на десять строк, если говорить о монолитной аппе. Но qlua в основную аппу не зашит, он плагин, так что на практике может быть довольно геморройно это сделать. <br />
			<i>21.09.2021 19:04:31, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58096/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58096/topic5983/</guid>
			<pubDate>Tue, 21 Sep 2021 19:04:31 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58088/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_2p0mmu6Q" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />зачем нагружать поток терминала<br />=============<br />Кто сказал "нагружать"? Задачи на 0.1-2 мс, без фанатизма.<br />Я даже не понимаю тех, кто в стремлении "разгрузить" основной поток перекидывает простейшие задачи (с временем выполнения менее 2 мс) из колбеков в main (что опять же не бесплатно в плане нагрузки), создавая километровые очереди и забывая об <B>общей</B> производительности. <br />
			<i>21.09.2021 12:04:47, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58088/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58088/topic5983/</guid>
			<pubDate>Tue, 21 Sep 2021 12:04:47 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58086/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_d1QAWhgd" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Да, но зачем нагружать поток терминала, пусть себе в сторонке что-то делается. Тогда можно было бы и нагруженные модули писать. Сейчас же в основном потоке только данные заполнить в общей области видимости, никаких ожиданий и долгих вычислений.<br />=============<br /> &nbsp; &nbsp; Справедливое замечание.<br /> &nbsp;Конечно, между колбеками и функцией main, следует создавать очереди, которые потокобезопасны, &nbsp;но кто это понимает?<br /> &nbsp;Большинство из тех, кто заходит на этот сайт, не проффесоналы. <br />
			<i>21.09.2021 11:33:48, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58086/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58086/topic5983/</guid>
			<pubDate>Tue, 21 Sep 2021 11:33:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58084/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Hk7U2bW0" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br />Отдельный поток у вас уже есть - main. Зачем ещё один городить?<br /><br />Дело в том, что вы так или иначе всё равно лезете в основной поток: GUI, хранилище данных.<br />=============<br />Да, но зачем нагружать поток терминала, пусть себе в сторонке что-то делается. Тогда можно было бы и нагруженные модули писать. Сейчас же в основном потоке только данные заполнить в общей области видимости, никаких ожиданий и долгих вычислений. <br />
			<i>21.09.2021 11:11:57, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58084/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58084/topic5983/</guid>
			<pubDate>Tue, 21 Sep 2021 11:11:57 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58083/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_iWSSIKnw" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Ну если уж просить, почему бы не попросить еще один поток для своих колбеков. Т.е. реализовать методы регистрации своих функций обратного вызова и отдельный поток для них, чтобы не лезть в основной поток вовсе.<br />=============<br /> &nbsp; То есть, это то что, реализовано в OS_Quesha. <br /> У меня есть гипотеза, почему это, до сих пор. не доступно для многих пользователей QUIK, но объявлять это не корректно. <br />
			<i>21.09.2021 11:10:09, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58083/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58083/topic5983/</guid>
			<pubDate>Tue, 21 Sep 2021 11:10:09 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58082/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_4vKsPBrx" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />попросить еще один поток для своих колбеков<br />=============<br />Отдельный поток у вас уже есть - main. Зачем ещё один городить?<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_c8ffQhn6" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />чтобы не лезть в основной поток вовсе.<br />=============<br />Дело в том, что вы так или иначе всё равно лезете в основной поток: GUI, хранилище данных. <br />
			<i>21.09.2021 11:05:01, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58082/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58082/topic5983/</guid>
			<pubDate>Tue, 21 Sep 2021 11:05:01 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58080/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Ну если уж просить, почему бы не попросить еще один поток для своих колбеков. Т.е. реализовать методы регистрации своих функций обратного вызова и отдельный поток для них, чтобы не лезть в основной поток вовсе. <br />
			<i>21.09.2021 10:50:15, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58080/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58080/topic5983/</guid>
			<pubDate>Tue, 21 Sep 2021 10:50:15 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58079/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_V8mAFfOd" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />Когда надо колбек выполнить в квиковском потоке, меняем выделение на вторую строку и вуаля, тут же отрабатывает колбек, чего мы и хотели.<br />=============<br /><br />Кста, main будет ждать завершения колбека, поэтому результат его работы сразу можно использовать в main.<br /><table class="forum-spoiler"><thead onclick="if (this.nextSibling.style.display=='none') { this.nextSibling.style.display=''; BX.addClass(this, 'forum-spoiler-head-open'); } else { this.nextSibling.style.display='none'; BX.removeClass(this, 'forum-spoiler-head-open'); } BX.onCustomEvent('BX.Forum.Spoiler:toggle', [{node: this}]); event.stopPropagation();"><tr><th><div>Скрытый текст</div></th></tr></thead><tbody class="forum-spoiler" style="display:none;"><tr><td>
====code====
<pre>local run = true
local tid
function OnStop()
&nbsp;&nbsp;run = nil
&nbsp;&nbsp;local t = tid
&nbsp;&nbsp;tid = nil
&nbsp;&nbsp;if t then DestroyTable(t) end
end

local result
local function RunAsCallback()
&nbsp;&nbsp;SetSelectedRow(tid, 2)
&nbsp;&nbsp;local r = result
&nbsp;&nbsp;result = nil
&nbsp;&nbsp;return r
end

function main()
&nbsp;&nbsp;tid = AllocTable()
&nbsp;&nbsp;AddColumn(tid, 1, '1', true, QTABLE_INT_TYPE, 1)
&nbsp;&nbsp;CreateWindow(tid)
&nbsp;&nbsp;InsertRow(tid, -1)
&nbsp;&nbsp;InsertRow(tid, -1)
&nbsp;&nbsp;SetWindowPos(tid, 0, 0, -1000, -1000)
&nbsp;&nbsp;SetSelectedRow(tid, 1)
&nbsp;&nbsp;SetTableNotificationCallback(tid, function(t, m, w)
&nbsp;&nbsp;&nbsp;&nbsp;if QTABLE_SELCHANGED == m then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if w == 2 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetSelectedRow(tid, 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = os.date()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;end)
&nbsp;&nbsp;while run do
&nbsp;&nbsp;&nbsp;&nbsp;local date = RunAsCallback()
&nbsp;&nbsp;&nbsp;&nbsp;message(date)
&nbsp;&nbsp;&nbsp;&nbsp;sleep(1000)
&nbsp;&nbsp;end
&nbsp;&nbsp;OnStop()
end</pre>
=============
</td></tr></tbody></table><br />Хотелось бы что-то типа такого &quot;из коробки&quot; без необходимости дёргать GUI. <br />
			<i>21.09.2021 10:47:22, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58079/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58079/topic5983/</guid>
			<pubDate>Tue, 21 Sep 2021 10:47:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58051/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Lo68Fqki" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br />с учётом, что SetSelectedRow - синхронное сообщение?<br />=============<br />В данном случае да, колбек дернут из потока квика, SendMessage отправляется из потока квика в поток квика, а это просто прямой вызов оконной процедуры. <br />
			<i>20.09.2021 12:19:36, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58051/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58051/topic5983/</guid>
			<pubDate>Mon, 20 Sep 2021 12:19:36 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58049/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_gOvze57X" href="/user/115/" bx-tooltip-user-id="115">_sk_</a> написал:<br />Получается, что лучше просить разработчиков реализовать п.1.<br />=============<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_IWJjJejJ" href="/user/115/" bx-tooltip-user-id="115">_sk_</a> написал:<br /><B><span class="bx-font" style="font-size:16pt; line-height: normal;">разработчики</span></B> могут нам что-то человеческое предоставить?<br />=============<br />А давайте все дружно позовем деда Мороза!<br /><br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_k25rIx8y" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />
====code====
<pre>
&nbsp;&nbsp;&nbsp;&nbsp;SetTableNotificationCallback (tid,&nbsp;&nbsp;function (t, m, w, l)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp;QTABLE_SELCHANGED&nbsp;&nbsp;==&nbsp;&nbsp;m&nbsp;&nbsp;then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if 2 == w then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetSelectedRow (t, 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message ( '!' )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end 
&nbsp;&nbsp;&nbsp;&nbsp;end)</pre>
=============
<br />=============<br />Допустимо ли использование SetSelectedRow внутри колбека QTABLE_SELCHANGED, с учётом, что SetSelectedRow - синхронное сообщение? <br />
			<i>20.09.2021 12:16:35, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58049/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58049/topic5983/</guid>
			<pubDate>Mon, 20 Sep 2021 12:16:35 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message50471/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_ko4ZNHr1" href="/user/1889/" bx-tooltip-user-id="1889">Sergey Denegin</a>, Элементарно, Господи! И не нужно никаких &quot;два цикла со sleep&quot;. Вот кусок main:<br />
====code====
<pre>while f do -- бесконечный цикл до остановки скрипта
 if fm&#62;3 then DestroyTable(t);fm=0;end;
 if fm==3 then DestroyTable(t);fm=1;end;
 if fm==1 then u();fm=2;end;&nbsp;&nbsp;&nbsp;-- рисуем или убираем всплывающее меню
 r();-- раз в 1.5 секунды запускаем утилиту опроса
sleep(1500);&nbsp;&nbsp;&nbsp;-- текущих данных и принятия решений по ним
end;&nbsp;&nbsp;&nbsp;-- конец бесконечного цикла
end;&nbsp;&nbsp;&nbsp;-- конец функции main()
</pre>
=============
<br />А вот эмулятор обработчика:
====code====
<pre>function r()&nbsp;&nbsp;&nbsp;-- мелкий обработчик прерывания по таймеру
 c=c+1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- счётчик прерываний
 if c==10 then c=0; R();end;&nbsp;&nbsp;&nbsp;-- прошло 15 секунд, включаем анализ
...</pre>
=============
КТО ИМЕННО &quot;полностью прекращает свою работу и просто ждет это время&quot;? Скрипт? Так это просто интерпретируемый текст - он вообще никогда не работает. &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" /> &nbsp; <br />
			<i>21.11.2020 09:16:27, Владимир.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message50471/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message50471/topic5983/</guid>
			<pubDate>Sat, 21 Nov 2020 09:16:27 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message50470/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_yrO0ZDje" href="/user/14299/" bx-tooltip-user-id="14299">Владимир</a> написал:<br />1) OnTimer прекрасно эмулируется в цикле со sleep, там же указывается период срабатывания (у меня их даже два: раз в полторы секунды и раз в 15 секунд). А никакого OnInit вообще нет.<br />=============<br />Подскажите, а как вам удается два цикла со sleep сделать? Вы внутри main их делаете? или внутри какого-то колбека?<br /><br />Я тоже использую sleep в main, но насколько я исследовал этот вопрос, когда идет функция sleep он полностью прекращает свою работу и просто ждет это время <br />
			<i>21.11.2020 00:55:26, Sergey Denegin.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message50470/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message50470/topic5983/</guid>
			<pubDate>Sat, 21 Nov 2020 00:55:26 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message50427/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_cSz5v8tV" href="/user/115/" bx-tooltip-user-id="115">_sk_</a> написал:<br />Осталось окно скрипта куда-нибудь спрятать<br />=============<br />Если полосы прокрутки выключены, можно спрятать в позицию (-1000, -1000), со включенными не придумал куда. С помощью длл можно скрыть, но тогда можно и совсем без окна обойтись. <br />
			<i>19.11.2020 01:56:26, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message50427/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message50427/topic5983/</guid>
			<pubDate>Thu, 19 Nov 2020 01:56:26 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message50418/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Идея прикольная :) Осталось окно скрипта куда-нибудь спрятать и будет &quot;зачётный костыль&quot;.<br /><br />Терминал является уже достаточно сложной системой, чтобы в нём были такого рода &quot;дыры&quot;, которыми можно пользоваться в благих целях.<br /><br />Ладно, а разработчики могут нам что-то человеческое предоставить?<br /><br />P.S. Вот было бы здорово создать реестр подобного рода маленьких хитростей. А то я, кажется, только<br />
====code====
<pre>table.ssort({ 0, 1 }, function(a, b)
Ваш код здесь
return true
end)</pre>
=============
<br />для синхронизации знаю. <br />
			<i>18.11.2020 13:36:02, _sk_.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message50418/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message50418/topic5983/</guid>
			<pubDate>Wed, 18 Nov 2020 13:36:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message50416/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_3qobo00q" href="/user/115/" bx-tooltip-user-id="115">_sk_</a> написал:<br />Костыли типа отправки какой-нибудь транзакции на сервер, чтобы OnTransReply сработал, не предлагать.<br />=============<br />А если без сетевого обмена костылик? Поглядите<br />
====code====
<pre>local run = true
local tid = nil

function main()
&nbsp;&nbsp;&nbsp;tid = AllocTable()
&nbsp;&nbsp;&nbsp;AddColumn(tid, 1, '1', true, QTABLE_INT_TYPE, 1)
&nbsp;&nbsp;&nbsp;CreateWindow(tid)
&nbsp;&nbsp;&nbsp;InsertRow(tid, -1)
&nbsp;&nbsp;&nbsp;InsertRow(tid, -1)
&nbsp;&nbsp;&nbsp;SetWindowPos(tid, 0, 0, -1000, -1000)
&nbsp;&nbsp;&nbsp;SetSelectedRow(tid, 1)
&nbsp;&nbsp;&nbsp;SetTableNotificationCallback(tid, function(t, m, w, l)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if QTABLE_SELCHANGED == m then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if 2 == w then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetSelectedRow(t, 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message('!')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end)
&nbsp;&nbsp;&nbsp;while run do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1000)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetSelectedRow(tid, 2)
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;OnStop()
end

function OnStop()
&nbsp;&nbsp;&nbsp;local t = tid
&nbsp;&nbsp;&nbsp;tid = nil
&nbsp;&nbsp;&nbsp;if t then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DestroyTable(t)
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;run = false
end
</pre>
=============
Создаем окошко с двумя строчками, выделяем первую, ставим колбек на изменение выделения, в колбеке возвращаем выделение в первую строку. Когда надо колбек выполнить в квиковском потоке, меняем выделение на вторую строку и вуаля, тут же отрабатывает колбек, чего мы и хотели. Вместо message(), естественно, вызываем что-то свое полезное. <br />
			<i>18.11.2020 12:45:55, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message50416/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message50416/topic5983/</guid>
			<pubDate>Wed, 18 Nov 2020 12:45:55 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message50414/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_hFYfxsin" href="/user/115/" bx-tooltip-user-id="115">_sk_</a> написал:<br />Есть потребность в отключении слушателей по таймауту (а не когда придёт очередной коллбэк)<br />=============<br /><br />"Отключить слушателей по таймауту (а не когда придёт очередной коллбэк)" абсолютно эквивалентно "в начале колбека проверить надо ли уведомлять этого конкретного слушателя или таймаут его уведомлений истёк". &nbsp; &nbsp; &nbsp;В целом вся эта машинерия выглядит через чур запутанной, потом же сами концов в ней не найдёте... "Почему этот слушатель не сработал? то ли по тайм-ауту отключили, то ли колбека не было, то ли просто что-то пошло не так." "Архитектурно-правильно".... но это так, мысли вслух <br />
			<i>18.11.2020 12:11:41, swerg.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message50414/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message50414/topic5983/</guid>
			<pubDate>Wed, 18 Nov 2020 12:11:41 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Расширить список функций обратного вызова</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message50413/topic5983/">Расширить список функций обратного вызова</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Костыли типа отправки какой-нибудь транзакции на сервер, чтобы OnTransReply сработал, не предлагать. <br />
			<i>18.11.2020 11:44:50, _sk_.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message50413/topic5983/</link>
			<guid>http://forum.quik.ru/messages/forum10/message50413/topic5983/</guid>
			<pubDate>Wed, 18 Nov 2020 11:44:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
