<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Ускоряем скрипт и выкидываем sleep]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Ускоряем скрипт и выкидываем sleep форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 03 May 2026 03:24:06 +0300</pubDate>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75844/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_9ge9vhmL" href="/user/15910/" bx-tooltip-user-id="15910">Serge123</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br />Нет никаких проблем в работе моей программы,Осталась лишь тебе понять то, что я написал Карл!!!<br />=============<br /> Я не Карл...<br />Это уже какая-то патология...<br />=============<br />Тогда не волнуйтесь. <br />Я вам раньше уже ответил, что мой вариант решает вашу проблему.<br />Но Вы стали утверждать обратное, так как ничего не поняли.<br />--------------------<br />Я на вашем примере написал ликбез для карла и других читателей. <br /> Вы можете это не читать. &nbsp;<br />Я же Вас не заставляю, а Вы меня не нанимали.<br />--------------------- <br />Вместо &quot;спасибо&quot; за то, что я вам разжевал &nbsp;бесплатно что-то и в рот положил, <br />вы надулись как рыба луна. <br />вот это действительно патология.<br />----------------------------<br />Я просто погулять вышел, ты понял Карл!!!<br />. <br />
			<i>13.06.2024 19:10:22, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75844/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75844/topic8609/</guid>
			<pubDate>Thu, 13 Jun 2024 19:10:22 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75842/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_YqKfqP9Y" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Нет никаких проблем в работе моей программы,Осталась лишь тебе понять то, что я написал Карл!!!<br />=============<br />Я не Карл...<br />Это уже какая-то патология... <br />
			<i>13.06.2024 10:36:27, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75842/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75842/topic8609/</guid>
			<pubDate>Thu, 13 Jun 2024 10:36:27 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75837/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_kycB2218" href="/user/15910/" bx-tooltip-user-id="15910">Serge123</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br />могу лишь рассказать как я решил эту проблему.<br />=============<br /> К сожалению, в этом ответе не сказано о решении этой проблемы...<br />А именно: как в main (которая сидит в dll) обработать таблицу alltrade, если при завершении работы OnAllTrade (которая тоже сидит в dll) стек её вызова (в котором сидит ссылка на табл. alltrade) должен очиститься?<br />Я вижу такие костыли:<br />- запретить сборку мусора (до 18:45).<br />- dll из OnAllTrade как-то связывается с Lua и Lua дублирует ссылки на alltrade в массив локальных переменных области видимости этого файла lua. Потом dll как-то даёт знать, что каким-то из этих переменных можно присвоить nil. Как это сделать, пока не знаю. М.б. это делается через (light)userdata, но я с этим не связывался.<br /><br />Как из Си заставить Lua продублировать ссылку на таблицу, если эта ссылка сидит в стеке? Как из Си вызвать скрипт Lua, чтобы он получил этот стек вызова OnAllTrade? Иначе придётся коллбэки делать на Lua и только main на Си, а этого не хочется из-за какой-то потери скорости.<br />=============<br />Попробую объяснить.<br />------------------<br />Не важно, что и где сидит. &nbsp; dll - это код программы. &nbsp;Для кода не нужна синхронизация потоков.<br />Синхронизация потоков нужна при обращении к данным.<br />----------------<br />Попробую снова объяснить как Ваша проблема решается на моей программе. <br /><B>ОЧЕРЕДЬ и EVENT - эти элементы и решают проблему.</B><br />------------------<br />Поясняю на примере:<br />1) Терминал вызывает OnAllTrade и передает в стеке указатель на таблицу, которая является новой строкой таблицы alltrade.<br />--------------------<br />2) В OnAllTrade указатель на полученную таблицу новой строки записывается в очередь &nbsp;<br /><B>C</B><B>охраняется в другой таблице КАРЛ </B><B>! ! </B><br />-----------------------<br />3) OnAlltrade заканчивает работу.<br /> Если очередь при этом содержит лишь один элемент, то устанавливается флаг EVENT.<br />----------------------------------<br />4) &nbsp;Если функция main была в состоянии WAIT, то она начинает обрабатывать элемент очереди <br /><B></B><B>И о чудо, Карл!!! &nbsp;там есть указатель на таблицу &nbsp;новой строки alltrade</B>, <br />при этом &nbsp;onAllTrade давно уже завершилась или может быть даже снова вызвана с новой таблицей новой строки. &nbsp;<br /><B>Ты понимаешь, Карл? Снова хоть тысячу раз!!!<br /></B>--------------------------<br />Если функция main обрабатывала очередь, то она и продолжает это делать, <br />а новые вызовы onAllTrade подкидывают новые таблицы &nbsp;новых строк alltrade &nbsp;в очередь.<br />--------------------------<br />И это все. <br /><B>Нет никаких проблем в работе моей программы,</B><br /><B>Осталась лишь тебе понять то, что я написал Карл!!!</B><br /> &nbsp; <br />
			<i>13.06.2024 07:15:57, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75837/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75837/topic8609/</guid>
			<pubDate>Thu, 13 Jun 2024 07:15:57 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75831/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Имел в виду, что для МЕНЯ это не решение проблемы, т.к. я не знаю, как применять LuaJIT и прочие штуки... <br />
			<i>11.06.2024 10:59:50, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75831/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75831/topic8609/</guid>
			<pubDate>Tue, 11 Jun 2024 10:59:50 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75830/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_ApqQz1VB" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />могу лишь рассказать как я решил эту проблему.<br />=============<br />К сожалению, в этом ответе не сказано о решении этой проблемы...<br />А именно: как в main (которая сидит в dll) обработать таблицу alltrade, если при завершении работы OnAllTrade (которая тоже сидит в dll) стек её вызова (в котором сидит ссылка на табл. alltrade) должен очиститься?<br />Я вижу такие костыли:<br />- запретить сборку мусора (до 18:45).<br />- dll из OnAllTrade как-то связывается с Lua и Lua дублирует ссылки на alltrade в массив локальных переменных области видимости этого файла lua. Потом dll как-то даёт знать, что каким-то из этих переменных можно присвоить nil. Как это сделать, пока не знаю. М.б. это делается через (light)userdata, но я с этим не связывался.<br /><br />Как из Си заставить Lua продублировать ссылку на таблицу, если эта ссылка сидит в стеке? Как из Си вызвать скрипт Lua, чтобы он получил этот стек вызова OnAllTrade? Иначе придётся коллбэки делать на Lua и только main на Си, а этого не хочется из-за какой-то потери скорости. <br />
			<i>11.06.2024 10:23:05, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75830/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75830/topic8609/</guid>
			<pubDate>Tue, 11 Jun 2024 10:23:05 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75823/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_T5bOyfoS" href="/user/15910/" bx-tooltip-user-id="15910">Serge123</a> написал:<br />Тут возникла новая проблема: если обработчик OnAllTrade на Си уже не будет обрабатывать этот вызов, а будет что-то записывать в очередь и делать выход, то как гарантировать, что память под таблицу alltrade не будет освобождена до обработки этой таблицы в функции main, которая тоже находится в dll? Совсем отключить сборку мусора, или есть что-то ещё?<br />=============<br />могу лишь рассказать как я решил эту проблему.<br />У меня колбеки обрабатываются не только в main, но и в других, новых потоках.<br />Так как все колбеки вызываются последовательно, то нет надобности делать много Event<br />У меня один event &nbsp;(см мои скрипты на форуме) &nbsp;и очередь.<br />Т е вызвал терминал колбек. В колбеке в очередь записывается номер колбека и входные параметры. <br />Если очередь пустая, то устанавливается флаг события.<br />В функции main &nbsp;, если очередь пустая wait ждет событие, иначе проводится обработка очереди. <br />Если колбеки не требуют сложных вычислений, то они обрабатываются внутри main.<br />Для сложной обработки, например , в портфеле множество бумаг, то для принятия решения для каждой бумаги вызывается новый поток из пула потоков ОC.<br />В этом потоке я запускаю LuasJIT (могу запустить python, terra,julia и др) &nbsp;вместо lua, что обеспечивает ускорение вычислений на порядок, по сравнению с вычислениями в main. <br />
			<i>11.06.2024 06:57:44, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75823/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75823/topic8609/</guid>
			<pubDate>Tue, 11 Jun 2024 06:57:44 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75818/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Тут возникла новая проблема: если обработчик OnAllTrade на Си уже не будет обрабатывать этот вызов, а будет что-то записывать в очередь и делать выход, то как гарантировать, что память под таблицу alltrade не будет освобождена до обработки этой таблицы в функции main, которая тоже находится в dll? Совсем отключить сборку мусора, или есть что-то ещё? <br />
			<i>10.06.2024 15:30:30, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75818/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75818/topic8609/</guid>
			<pubDate>Mon, 10 Jun 2024 15:30:30 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75814/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Насколько я понял из <noindex><a href="https://learn.microsoft.com/ru-ru/windows/win32/api/synchapi/nf-synchapi-setevent" target="_blank" rel="nofollow">https://learn.microsoft.com/ru-ru/windows/win32/api/synchapi/nf-synchapi-setevent</a></noindex> , Виндовс не суммирует установку событий во флаге события, если несколько раз вызвать SertEvent. Поэтому main должна проверять, не был ли вызван другой коллбэк, установка события от которого могла быть потеряна. <br />
			<i>10.06.2024 14:24:49, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75814/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75814/topic8609/</guid>
			<pubDate>Mon, 10 Jun 2024 14:24:49 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75812/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Насколько я понял, т.к. в моём случае параметр dwFlags у CreateEventA равен 0, то ResetEvent не требуется. Похоже, когда Виндовс по установленному коллбэком флагу события запускает main, то Виндовс сбрасывает этот флаг, поэтому в принципе возможна потеря возникновения события. Ясно что события не буферизуются. Ожидание множества событий тут по-моему не очень подходит, т.к. main должна отрабатывать при возникновении хотя бы одного события.<br /><br />Такую книжку Рихтера (только в синей ламинированной обложке) я купил давно, тогда я ещё не программировал на Си. Пока что меня не интересует общая теория семафоров, светофоров и шлагбаумов: я сейчас конкретно переписываю скрипт с Луа на Си dll, отвлекаться на эксперименты неохота. Пока у меня обработка событий на Си происходит в коллбэках и я собираюсь перенести её в main с использованием очереди и объектов событий, как это у меня работает в Луа. <br />
			<i>10.06.2024 13:35:50, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75812/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75812/topic8609/</guid>
			<pubDate>Mon, 10 Jun 2024 13:35:50 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75807/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_ggZ6CVuW" href="/user/15910/" bx-tooltip-user-id="15910">Serge123</a> написал:<br />Насколько я понял, надо использовать параметр lpName в CreateEventA: коллбэки создают события со своими именами. Осталось уточнить: что будет, если оба коллбэка успеют создать события, а main ещё не запустилась для их обработки. Не будет ли потеряно второе событие?<br />=============<br />createEvent создает не событие, а объект &quot;событие) <br />упрощенно это значит, что OS выделяет для флага события ячейку и вернет его имя <br />Имя флага всегда уникально. <br />-----------------<br />Далее мы либо устанавливаем Set &nbsp;флаг или сбрасываем &nbsp;Reset.<br />Wait.. - это как бы аналог условного цикла проверки состояния флага c заданием времени ожидания. <br />Проверку делает OC а поток бездействует пока Wait<br />------------<br />Если событий много то используем wait дя нескольких событий либо более сложные функции ожидания (семафоры и т д)<br />================= <br />Если есть желание изучить механизмы синхронизации потоков рекомендую книгу:<br />[FILE ID=12068]<br /> &nbsp; <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=12068&" width="732" height="580" /><br /><i>10.06.2024 13:11:49, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75807/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75807/topic8609/</guid>
			<pubDate>Mon, 10 Jun 2024 13:11:49 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75802/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Насколько я понял, надо использовать параметр lpName в CreateEventA: коллбэки создают события со своими именами. Осталось уточнить: что будет, если оба коллбэка успеют создать события, а main ещё не запустилась для их обработки. Не будет ли потеряно второе событие? <br />
			<i>10.06.2024 12:24:27, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75802/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75802/topic8609/</guid>
			<pubDate>Mon, 10 Jun 2024 12:24:27 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75801/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			И чтобы событие создавалось обоими коллбэками, если даже они это сделали почти одновременно. <br />
			<i>10.06.2024 12:15:04, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75801/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75801/topic8609/</guid>
			<pubDate>Mon, 10 Jun 2024 12:15:04 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75800/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_oirIP2M8" href="/user/16015/" bx-tooltip-user-id="16015">funduk</a> написал:<br />Для моих целей сообщения тоже оказались заметно быстрее, чем sleep.<br />=============<br />У меня возник вопрос: если используется упрощённый вариант работы с событиями
====code====
<pre>CreateEventA(NULL, false, false, NULL);
WaitForSingleObject
SetEvent
</pre>
=============
и оба коллбэка OnAllTrade и OnQuote почти одновременно выдали
====code====
<pre>SetEvent(evt)
</pre>
=============
При вторичной выдаче SetEvent(evt) эта установка события не выполнится?<br />Теперь вызывается main и начинает их обрабатывать событие: она проверяет и обрабатывает общую очередь от обоих коллбэков. Это правильная работа с событиями?<br /><br />Как надо по-минимуму изменить параметры CreateEventA, WaitForSingleObject и SetEvent, чтобы main знала, какой именно коллбэк выдал SetEvent(evt)? <br />
			<i>10.06.2024 12:12:27, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75800/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75800/topic8609/</guid>
			<pubDate>Mon, 10 Jun 2024 12:12:27 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75464/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Для моих целей сообщения тоже оказались заметно быстрее, чем sleep. На скрине для каждой пары неродных для квика стаканов левый отрисован с ожиданием через сообщения, правый - через sleep. Внизу стаканов статистика потерь, они на правых стаканах больше. Kernel time и cpu time тоже меньше на потоке, который ждёт событий.<br />Поскольку рисование стаканов идёт в main скрипта, нельзя использовать WaitForMultipleObjects для событий из OnQuote и OnStop, нужно MsgWaitForMultipleObjectsEx, чтобы main включался на событиях GUI для стаканов. Её нет в w32, пришлось подключать через cffi-lua. Инструкция по сборке написана <noindex><a href="https://github.com/q66/cffi-lua/issues/45" target="_blank" rel="nofollow">тут</a></noindex>. Если сравнивать время исполнения между w32 и cffi-lua, то конечно же w32 быстрее (SetEvent на 12%, CreateEvent на 23%).<br />Важные части кода:<br /><br />
====code====
<pre>local w32 = require "w32-ext"
local ffi = require "cffi"
local SetEvent = w32.SetEvent
local MsgWaitForMultipleObjectsEx = w32.MsgWaitForMultipleObjectsEx
local cb_t = {'EDM4','SiM4','CRM4','CNYRUB_TOM'}
local e_quote, e_stop
local is_run = true

function OnQuote(class_code, sec_code)
&nbsp;&nbsp;local sent = cb_t&#91;sec_code&#93;
&nbsp;&nbsp;if sent then
&nbsp;&nbsp;&nbsp;&nbsp;cb_t&#91;sec_code&#93; = sent + 1
&nbsp;&nbsp;&nbsp;&nbsp;SetEvent(e_quote)
&nbsp;&nbsp;end
end
function OnStop()
&nbsp;&nbsp;&nbsp;&nbsp;is_run = false
&nbsp;&nbsp;&nbsp;&nbsp;SetEvent(e_stop)
end
function main()
&nbsp;&nbsp;e_stop = w32.CreateEvent(nil, 0, 0, nil)
&nbsp;&nbsp;e_quote = w32.CreateEvent(nil, 0, 0, nil)
&nbsp;&nbsp;local events = ffi.new("HANDLE&#91;2&#93;", {e_quote, e_stop})
&nbsp;&nbsp;local WAIT_TIMEOUT = w32.WAIT_TIMEOUT
&nbsp;&nbsp;while is_run do
&nbsp;&nbsp;&nbsp;&nbsp;local res = MsgWaitForMultipleObjectsEx(2, events, 500, 7423, 0) -- QS_ALLINPUT == 7423
&nbsp;&nbsp;&nbsp;&nbsp;if res == 1 then break end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if res == WAIT_TIMEOUT then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- по таймауту обработать сообщения, например, о смене foreground окна
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- обновить стаканы
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;end
end

</pre>
=============
w32-ext.lua:<br />
====code====
<pre>local w32 = require("w32")
local ffi = require "cffi"
ffi.cdef &#91;&#91;
&nbsp;&nbsp;&nbsp;&nbsp;typedef unsigned int UINT;
&nbsp;&nbsp;&nbsp;&nbsp;typedef unsigned long DWORD;
&nbsp;&nbsp;&nbsp;&nbsp;typedef long long LRESULT;
&nbsp;&nbsp;&nbsp;&nbsp;typedef long long LPARAM;
&nbsp;&nbsp;&nbsp;&nbsp;typedef unsigned long long WPARAM;
&nbsp;&nbsp;&nbsp;&nbsp;//typedef void* HWND; // in windows
&nbsp;&nbsp;&nbsp;&nbsp;typedef intptr_t HWND; // uintptr_t not ok as it appends 'ULL', LPARAM also ok
&nbsp;&nbsp;&nbsp;&nbsp;typedef intptr_t HANDLE;

&nbsp;&nbsp;&nbsp;&nbsp;void SetLastError(DWORD);
&nbsp;&nbsp;&nbsp;&nbsp;//LRESULT SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
&nbsp;&nbsp;&nbsp;&nbsp;HWND GetForegroundWindow();
&nbsp;&nbsp;&nbsp;&nbsp;DWORD MsgWaitForMultipleObjectsEx(DWORD nCount, const HANDLE *pHandles, DWORD dwMilliseconds, DWORD dwWakeMask, DWORD dwFlags);
&#93;&#93;

w32.SetLastError = ffi.C.SetLastError
w32.GetForegroundWindow = ffi.C.GetForegroundWindow
w32.MsgWaitForMultipleObjectsEx = ffi.C.MsgWaitForMultipleObjectsEx
-- those calls trigger 127 error on first invocation
w32.SetLastError(0)

return w32
</pre>
============= <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=11947&" width="3840" height="2160" /><br /><img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=11948&" width="1660" height="1070" /><br /><i>02.05.2024 15:33:16, funduk.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75464/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75464/topic8609/</guid>
			<pubDate>Thu, 02 May 2024 15:33:16 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75459/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Эту возможность надо в квик добавить. <br />
			<i>01.05.2024 11:30:29, Constantin.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75459/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75459/topic8609/</guid>
			<pubDate>Wed, 01 May 2024 11:30:29 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75444/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Присоединяюсь.<br />Не нужно иметь много образования чтобы понять что техника с ожиданием событий эффективна.<br />А реализация не так сложна, как кажется на первый взгляд. <br />
			<i>28.04.2024 13:05:04, yiv1.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75444/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75444/topic8609/</guid>
			<pubDate>Sun, 28 Apr 2024 13:05:04 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Ускоряем скрипт и выкидываем sleep</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message75441/topic8609/">Ускоряем скрипт и выкидываем sleep</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Добрый день, Всем<br />С момента появления VMLua в КВИКЕ неоднократно рассказывал о том, что применение event вместо sleep <br />не только экономит ресурсы процессора, но и позволяет не пропускать события в колбеках и максимально бысто на них реагировать.<br />говорил об этом например здесь:<br /><noindex><a href="https://forum.quik.ru/forum17/topic8426/" target="_blank" rel="nofollow">https://forum.quik.ru/forum17/topic8426/</a></noindex><br />---------------------<br />К сожалению, кроме бессмысленного хамства некоторых посетителей форума, ничего конкретного никто не написал.<br />---------------<br />Но вот наконец-то появился вменяемый чел <noindex><a href="https://forum.quik.ru/user/16011/" target="_blank" rel="nofollow">paluke</a></noindex> .<br />и после моей попытки в очередной раз объяснить преимущество event <br /><noindex><a href="https://forum.quik.ru/messages/forum10/message75435/topic8600/#message75435" target="_blank" rel="nofollow">https://forum.quik.ru/messages/forum10/message75435/topic8600/#message75435</a></noindex><br /><br /><br />[FILE ID=11944]<br /><br />[FILE ID=11945]<br /><br />он все же решил проверить это и убедился, что это так действительно: &nbsp;<br /><br />[FILE ID=11946]
====code====
<pre>Просто проверка концепции:
Кодw32 = require("w32")

run = true
evt = false

function OnInit()
&nbsp;&nbsp;evt = w32.CreateEvent(nil, 0, 0, nil)
end

function OnStop()
 run = false
 w32.SetEvent(evt)
end

function main()
&nbsp;&nbsp;while run do
&nbsp;&nbsp;&nbsp;&nbsp; w32.WaitForSingleObject(evt, 1000000)
&nbsp;&nbsp;end
&nbsp;&nbsp;w32.CloseHandle(evt)
end

В колбеках вызываете SetEvent - main сразу просыпается.
</pre>
=============
С чем Всех и поздравляю. <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=11944&" width="1072" height="680" /><br /><img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=11945&" width="1088" height="344" /><br /><img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=11946&" width="1072" height="524" /><br /><i>28.04.2024 07:44:06, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message75441/topic8609/</link>
			<guid>http://forum.quik.ru/messages/forum17/message75441/topic8609/</guid>
			<pubDate>Sun, 28 Apr 2024 07:44:06 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
	</channel>
</rss>
