<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Как грамотно сделать функцию OnStop() последней в теле скрипта?]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Как грамотно сделать функцию OnStop() последней в теле скрипта? форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 03 May 2026 05:21:45 +0300</pubDate>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61841/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_3i9UuByX" href="/user/62/" bx-tooltip-user-id="62">nikolz</a>, Чтобы скрипт корректно завершил работу, в колбеке OnStop, нужен нормальный колбек OnStop, а не этот маразм со &quot;специально сделанным (!!!) возвратом со значением времени задержки завершения&quot;. В 99 случаях из 100 работа скрипта завершается корректно, и вся &quot;работа&quot; этого &quot;коллбека&quot; состоит в том, чтобы сбросить флаг останова - <B>И ВСЁ!!!</B> Этот же придурок считает, что его вызвали для <B>АВАРИЙНОГО</B> завершения скрипта, причём даже этого он тоже делать не умеет. Разделение по потокам - ещё один идиотизм, источник бесконечных глюков и ничего более. Когда я узнал, что <B>интерпретируемый</B> код способен подвесить задачу, я просто не поверил своим глазам! Кстати, какое бы Вы ни указали время задержки завершения, это ничего не значит и не гарантирует от зависания при выходе - этот придурок просто и нагло не отдаёт управление &quot;для завершения всех ваших плюшек в скрипте&quot;. <br />
			<i>08.02.2022 09:28:34, Владимир.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61841/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61841/topic7149/</guid>
			<pubDate>Tue, 08 Feb 2022 09:28:34 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61839/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Добавлю свои пять копеек.<br />чтобы скрипт корректно завершил работу, в колбеке OnStop() &nbsp;специально сделан возврат со значением времени задержки завершения. <br />--------------------------------------<br />Поэтому все другие колбеки будут вызываться после выхода из OnStop.<br />-------------------------------<br />функция main - это другой поток и она вызывается вне зависимости от колбеков.<br />-------------------------------------<br />Чтобы ничего не зависало при выходе вы должны указать время задержки завершение,<br /> которое хватит для завершения всех ваших плюшек в скрипте.<br />----------------------<br />Это время Вы определяете сами, так как никто не знает что Вы нагородили в своем скрипте.<br />Вполне возможно, что и 5 секунд может не хватить чтобы корректно завершить скрипт. <br />
			<i>08.02.2022 06:44:56, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61839/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61839/topic7149/</guid>
			<pubDate>Tue, 08 Feb 2022 06:44:56 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61837/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_gjtMnS48" href="/user/82/" bx-tooltip-user-id="82">swerg</a> написал:<br />Тут бы пример.Честно говоря не верится мне, что если OnStop() содержит только{ &nbsp; Stopped = true; &nbsp; return 5;}то переменные, используемые только в main() внезапно становятся равными nil после этого.Ну а по примеру уже можно было бы и подсказать что там не так.<br />=============<br /><br />Пример привести сложно, ибо, он боевой и его долго &quot;чистить&quot; перед выкладкой &quot;на показ&quot;. А моделировать ситуацию искусственно - боюсь не сумею.<br /><br /><br />Дело в том, что код мой разбит на модули, которые, может, подключены некорректно. Хотя, сам принцип брал из кусков Вашего кода на Вашем форуме и QLUA не ругался на меня ни разу.<br /><br />
====code====
<pre>-- получается адрес рабочей папки
Adress_Work_DIR = getScriptPath()

-- Добавляется к переменной поиска окружения адрес папки скрипта,
-- чтобы интерпретатор знал, где искать модули
package.path = package.path..";"..Adress_Work_DIR.."&#92;&#92;?.lua"

require "stand_mod"
require "init_mod"
require "scan_mod"
require "quik_mod"
</pre>
=============
<br /><br />В общем, цель поста была не в том, чтобы разобраться почему приведенный пример не работает, а в том, чтобы сделать так, чтобы оно работало.<br />Меня вовсе не устраивало, когда скрипт завершал свою работу в любом месте, которое я не могу предсказать.<br /><br />Я сделал логгирование в файл и писал туда после завершения OnStop() системное время с микросекундами.<br />Без использования return в файл писалось как раз на пять секунд записей. QUIK работал стабильно.<br /><br />После использования return 5000 тоже несколько запусков писалось на пять секунд записей, но после некоторого времени (минут пять или семь) QUIK умирал напрочь при нажатии любого пункта меню.<br />Собственно, именно этот эксперимент и побудил меня просить помощи на форуме.<br /><br />А сообщением &quot;attempt to use a closed file&quot; я лишь хотел подчеркнуть, что управление все-равно возвращается в main(), даже не взирая на return 0 и там что-то успевает происходить.<br />То есть, как раз удачный случай, чтобы показать, что прерывание скрипта может произойти в любой момент, в том числе уже после анализа условия условного оператора вернуться в его тело и выполнить его уже не зная, что условие изменилось.<br /><br />Надеюсь, что теперь - все стройно получилось. main() получает сигнал, что OnStop() его &quot;прибьет&quot; скоро и выходит из цикла ожидания, чтобы снять заявки, закрыть файлы, почистить перья и только потом, разрешает OnStop() его &quot;прибить&quot;. <br />
			<i>07.02.2022 23:08:34, Денис.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61837/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61837/topic7149/</guid>
			<pubDate>Mon, 07 Feb 2022 23:08:34 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61835/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_54WPBsfR" href="/user/15474/" bx-tooltip-user-id="15474">Денис</a> написал:<br />Прежде всего, низкий Вам поклон за Ваш форум, если бы не он, я бы бросил изучать Lua ровно там же, где и начал.<br />=============<br />Спасибо Вам на добром слове &nbsp;<img src="http://forum.quik.ru/upload/main/smiles/5/icon_redface.png" border="0" data-code=":oops:" data-definition="SD" alt=":oops:" style="width:16px;height:16px;" title="Смущенно" class="bx-smile" /> &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 />Например, в скрипте получены значения переменных и он должен просто их сложить. Все прекрасно до тех пор, пока не нажата кнопка "Остановить" - тут скрипт вылетает со словами "Не могу сложить а и б, потому что б равно nil.<br />С какого перепугу, имеющая определенное значение переменная б, вдруг, его теряет после отработки функции OnStop?<br />=============<br />Тут бы пример.<br />Честно говоря не верится мне, что если OnStop() содержит только<br />{<br /> &nbsp; Stopped = true;<br /> &nbsp; return 5;<br />}<br />то переменные, используемые только в main() внезапно становятся равными nil после этого.<br />Ну а по примеру уже можно было бы и подсказать что там не так. <br />
			<i>07.02.2022 22:24:42, swerg.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61835/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61835/topic7149/</guid>
			<pubDate>Mon, 07 Feb 2022 22:24:42 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61831/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_EPR88CoX" href="/user/82/" bx-tooltip-user-id="82">swerg</a>, Ну, вот он я - открываю файл в main, а закрываю в OnStop. Мало того: я ещё его и ПЕРЕоткрываю в обработчике событий от юзера! Все свои действия считаю безусловно правильными. Да, иногда выскакивает &quot;attempt to use a closed file&quot; - абсолютно непонятно, чего ему надобно? Да и не очень интересно.<br /><br />И я тоже &quot;мгновенно по выходу из OnStop прибиваю поток main&quot; - чтобы что? На это подробно отвечал Антон ещё в самые первые дни после моего появления здесь.<br /><br />А &quot;оставшаяся часть софта&quot; начинает глючить ВСЕГДА И ВЕЗДЕ! Я что-то вообще не могу припомнить ни единой &quot;части&quot;, которая бы НЕ глючила!<br /><br />В чем ценность этой демонстрации? В разумно заданном вопросе, на который был дан профессиональный ответ - чрезвычайно редкая ситуация на этом форуме! <br />
			<i>07.02.2022 20:37:15, Владимир.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61831/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61831/topic7149/</guid>
			<pubDate>Mon, 07 Feb 2022 20:37:15 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61830/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_SmUQtar3" href="/user/82/" bx-tooltip-user-id="82"><img src="http://forum.quik.ru/upload/main/smiles/5/icon_biggrin.png" border="0" data-code=":lol:" data-definition="SD" alt=":lol:" style="width:16px;height:16px;" title="Широкая улыбка" class="bx-smile" /> swerg</a> написал:<br />Открываем файл в main(), а закрываем зачем-то в другом потоке в OnStop().<br />=============<br />Здравствуйте, уважаемый <a class="blog-p-user-name" id="bp_Ke0pmIcc" href="/user/82/" bx-tooltip-user-id="82">swerg</a> !<br />Прежде всего, низкий Вам поклон за Ваш форум, если бы не он, я бы бросил изучать Lua ровно там же, где и начал. К сожалению, на Вашем форуме рассматриваются более глубокие вопросы и там я не решился спрашивать советов.<br /><br />Теперь, позволю себе пояснить откуда родился такой &quot;кракозябр&quot;. Я столкнулся с проблемой, что прерывание OnStop() прилетает в любом операторе main() и после своего завершения вызывает ошибки в операторах, в которых ошибок быть не должно.<br /><br />Например, в скрипте получены значения переменных и он должен просто их сложить. Все прекрасно до тех пор, пока не нажата кнопка &quot;Остановить&quot; - тут скрипт вылетает со словами &quot;Не могу сложить а и б, потому что б равно nil.<br />С какого перепугу, имеющая определенное значение переменная б, вдруг, его теряет после отработки функции OnStop?<br /><br />Первое, что пришло в голову - это сделать функцию OnStop последней, так как поведение скрипта в main() после ее запуска теряет штатную предсказуемость. Ну, не могу же я каждый оператор &quot;обернуть&quot; if not Stopped then... Да и бесполезно это, есть ведь еще и функции QLUA, там, уж, точно ничего не обернешь.<br /><br />А раз она (OnStop()) последняя - то она и должна, снять все заявки, закрыть все файлы и сохранить данные, подлежащие хранению.<br /><br />Но, чтобы я не делал, управление после завершения работы OnStop() все-равно передавалось в main() и он эпизодически вылетал с руганью на nil различных переменных.<br /><br />Собственно, простое лечение этой беды подсказал уважаемый <noindex><a href="https://forum.quik.ru/user/1222/" target="_blank" rel="nofollow">Anton</a></noindex> - достаточно запретить OnStop() завершаться раньше, чем закончится main() и вуаля, проблема решена. Мне, на шестом десятке лет, решившему, вдруг, изучать программирование &quot;себе на дому&quot;, да еще с Lua, не зная ни одного диалекта C, конечно, такое простое и изящное решение в голову прийти не могло.<br /><br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_kI7alv32" href="/user/82/" bx-tooltip-user-id="82">swerg</a> написал:<br />2. Из OnStop() возвращаем 0<br />Зачем? принуждаем QUIK мгновенно по выходу из OnStop() прибиваь поток main() - чтобы что? чтобы не дать функции потока корректно доработать (хотя доработает она очень быстро в приведенном слуучае), т.к. взводим флаг Stopped <br />Делаем всё, чтобы насильно прибить потоковую функцию, от нее ожидаемо повисают сопли незакрытых ресурсов, куски незафинализированных вызовов Lua.<br />А после - удивительно! - оставшаяся часть софта начинает глючить (и я подозреваю, что QUIK эти 5..7 минут не просто сам по себе живет, наверняка выполняются другие Lua-скрипты)<br /><br />Ну т.е. сделано все, чтобы ожидаемо получить глюки.<br />Но зачем?? В чем ценность этой демонстрации?<br />=============<br />Вот, именно, отсюда и родился return 0, чтобы после завершения OnStop() не было глюков при завершении скрипта main() Мне нужно было, чтобы после завершения функции OnStop() ни один оператор main() не выполнялся, чтобы скрипт не вылетал по ошибке со всеми &quot;грязными&quot; вытекающими последствиями в виде незакрытых файлов и недосохраненных данных.<br /><br />Но мне и в голову не приходило, что можно &quot;притормозить&quot; OnStop() от завершения, а в это время спокойно и без глюков доработать до оператора end<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_EjmGZT56" href="/user/82/" bx-tooltip-user-id="82">swerg</a> написал:<br />Ну т.е. сделано все, чтобы ожидаемо получить глюки.<br />Но зачем?? В чем ценность этой демонстрации?<br />=============<br /><br />Это была не демонстрация, а просьба о помощи &nbsp;<img src="http://forum.quik.ru/upload/main/smiles/5/icon_biggrin.png" border="0" data-code=":lol:" data-definition="SD" alt=":lol:" style="width:16px;height:16px;" title="Широкая улыбка" class="bx-smile" /> &nbsp; <br />
			<i>07.02.2022 20:09:31, Денис.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61830/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61830/topic7149/</guid>
			<pubDate>Mon, 07 Feb 2022 20:09:31 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61829/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			2. Из OnStop() возвращаем 0<br />Зачем? принуждаем QUIK мгновенно по выходу из OnStop() прибиваь поток main() - чтобы что? чтобы не дать функции потока корректно доработать (хотя доработает она очень быстро в приведенном слуучае), т.к. взводим флаг Stopped <br />Делаем всё, чтобы насильно прибить потоковую функцию, от нее ожидаемо повисают сопли незакрытых ресурсов, куски незафинализированных вызовов Lua.<br />А после - удивительно! - оставшаяся часть софта начинает глючить (и я подозреваю, что QUIK эти 5..7 минут не просто сам по себе живет, наверняка выполняются другие Lua-скрипты)<br /><br />Ну т.е. сделано все, чтобы ожидаемо получить глюки.<br />Но зачем?? В чем ценность этой демонстрации? <br />
			<i>07.02.2022 19:32:38, swerg.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61829/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61829/topic7149/</guid>
			<pubDate>Mon, 07 Feb 2022 19:32:38 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61828/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			(это рука-лицо а не форум) <br />
			<i>07.02.2022 19:28:00, swerg.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61828/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61828/topic7149/</guid>
			<pubDate>Mon, 07 Feb 2022 19:28:00 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61827/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			По-моему, код в первом сообщении специально написан так, чтобы максимально пройтись по граблям.<br /><br />1. Открываем файл в main(), а закрываем зачем-то в другом потоке в OnStop().<br />Это и само по себе некрасиво просто-напросто (открывать в одном месте, в закрывать в другом, совершенно не связанном ни визуально, ни логически), да еще и ожидаемое может приводить (и приводит) к появлению сообщения "attempt to use a closed file", механизм появления которого вполне понятен. (нет? уточните, мне не сложно, напишу, но потом, не буду это сообщение разбухать).2. <br />
			<i>07.02.2022 19:27:33, swerg.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61827/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61827/topic7149/</guid>
			<pubDate>Mon, 07 Feb 2022 19:27:33 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61821/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_5uJoVVCn" href="/user/15474/" bx-tooltip-user-id="15474">Денис</a> написал:<br />подключены к системе СБП от ЦБ<br />=============<br />Пришлось гуглить, что это ) оказалось - не подключен. Ну да это и неважно.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_h0z7BRjh" href="/user/14299/" bx-tooltip-user-id="14299">Владимир</a> написал:<br />А потому и логически, и физически, завершающие операции нужно бы делать именно в мейне, а в OnStop просто сбрасывать флаг бесконечного цикла.<br />=============<br />В идеале да. Тут, как в сях иногда, без break переходим на следующий кейс:<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_oyA60d2K" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br />Получается с той или иной долей вероятности можно налететь на такое при любом значении в return и даже без него?<br />=============<br />Трудно сказать с уверенностью про все случаи. По логике, если TerminateThread не вызывается (т.е. когда WaitForSingleObject дождалась завершения мейна), все происходит как ожидалось. Ну с поправкой на то, что цикл сообщений стоит. Вообще я бы не так сделал, как сделано. Сейчас оно примерно так<br />
====code====
<pre>void OnScriptStopButtonClick()
{
&nbsp;&nbsp;&nbsp;&nbsp;int timeout = ScriptOnStop();
&nbsp;&nbsp;&nbsp;&nbsp;if(WAIT_TIMEOUT == WaitForSingleObject(scriptmainthread, timeout))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TerminateThread(scriptmainthread);
&nbsp;&nbsp;&nbsp;&nbsp;ScriptCleanup();
&nbsp;&nbsp;&nbsp;&nbsp;NotifyMainWindow(script_stopped);
}
</pre>
=============
а лучше бы было как-то типа<br />
====code====
<pre>void OnScriptStopButtonClick()
{
&nbsp;&nbsp;&nbsp;&nbsp;int timeout = ScriptOnStop();
&nbsp;&nbsp;&nbsp;&nbsp;ScriptDisallowCallbacks();
&nbsp;&nbsp;&nbsp;&nbsp;SetTimer(timeout, ScriptStopProcedure);
&nbsp;&nbsp;&nbsp;&nbsp;NotifyMainWindow(script_stopping);
}

void ScriptStopProcedure()
{
&nbsp;&nbsp;&nbsp;&nbsp;if(WAIT_TIMEOUT == WaitForSingleObject(scriptmainthread, 0))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TerminateThread(scriptmainthread);
&nbsp;&nbsp;&nbsp;&nbsp;ScriptCleanup();
&nbsp;&nbsp;&nbsp;&nbsp;NotifyMainWindow(script_stopped);
}
</pre>
=============
Однако есть подозрение, что при закрытии квика с работающими скриптами они останавливаются в WM_DESTROY, и оттуда вот так выйти и ждать таймеров не выйдет, т.к. окно будет прибито виндой раньше, чем дождемся таймеров. В итоге, если все это верно, это улучшение потребует вообще весь квик переделывать, что вряд ли.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_qxLLnxLK" href="/user/15474/" bx-tooltip-user-id="15474">Денис</a> написал:<br />Функции обратного вызова перестают работать после окончания работы функции OnStop() или после ее вызова?<br />=============<br />Правильней будет сказать, что перестает работать скрипт. Колбеки не могут быть вызваны, пока окружающий OnStop код в квике не закончится, а когда он закончится - скрипта уже не существует. Пока обрабатывается OnStop (и любой другой колбек), другой колбек вызван быть не может. Мы так считаем, хотя Владимир вроде находил какой-то случай, когда колбек оказывался вложенным, но списали на случайный глюк. <br />
			<i>07.02.2022 13:20:22, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61821/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61821/topic7149/</guid>
			<pubDate>Mon, 07 Feb 2022 13:20:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61813/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_Vpot4Q0o" href="/user/15474/" bx-tooltip-user-id="15474">Денис</a>, Да, решений может быть множество, но такое - одно: только один коллбек на все случаи жизни, так что плевать, работают функции обратного вызова после окончания OnStop или нет - в этом варианте их просто нет, как и самого OnStop. OnTrade тоже загружен до безобразия всяким действиями - а что делать? <br /><br />Я бы не стал полагаться на &quot;блага цивилизации&quot; Четверть, если не треть кода моего скрипта создана исключительно для борьбы с глюками, появляющимися при работе этих самых &quot;благ&quot;. <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>07.02.2022 10:24:34, Владимир.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61813/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61813/topic7149/</guid>
			<pubDate>Mon, 07 Feb 2022 10:24:34 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61812/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_KcDuB5K6" href="/user/14299/" bx-tooltip-user-id="14299">Владимир</a> написал:<br /><noindex><a href="/user/15474/" target="_blank" rel="nofollow">Денис</a></noindex>, Кстати, есть ещё одно решение - я даже когда-то хотел его реализовать: вообще отказаться от OnStop, а выход реализовать по собственному обработчику событий (по мышке или по клавише). В этом случае всё прекрасно отработает - и с файлами, и с таблицами. Отказался потому, что когда-нибудь рука всё равно даванёт на кнопку &quot;остановить&quot;, и я останусь без результатов торговли последнего запуска. Потом, правда, я всё равно стал сбрасывать дамп каждые 5 минут (по другим причинам - Квик стал вылетать &quot;без объявления войны&quot;), так что можно бы сделать и так, но мне уже лень там что-либо перестраивать.<br />=============<br /><br />Решений может быть множество :) Кстати, возник вопрос. Функции обратного вызова перестают работать после окончания работы функции OnStop() или после ее вызова?<br />Возможно, без return на цикле со sleep(0) удерживая OnStop() от завершения - можно продолжать пользоваться всеми благами цивилизации? <br />
			<i>07.02.2022 10:08:27, Денис.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61812/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61812/topic7149/</guid>
			<pubDate>Mon, 07 Feb 2022 10:08:27 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61811/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_qPdCUCgs" href="/user/15474/" bx-tooltip-user-id="15474">Денис</a>, Кстати, есть ещё одно решение - я даже когда-то хотел его реализовать: вообще отказаться от OnStop, а выход реализовать по собственному обработчику событий (по мышке или по клавише). В этом случае всё прекрасно отработает - и с файлами, и с таблицами. Отказался потому, что когда-нибудь рука всё равно даванёт на кнопку &quot;остановить&quot;, и я останусь без результатов торговли последнего запуска. Потом, правда, я всё равно стал сбрасывать дамп каждые 5 минут (по другим причинам - Квик стал вылетать &quot;без объявления войны&quot;), так что можно бы сделать и так, но мне уже лень там что-либо перестраивать. <br />
			<i>07.02.2022 09:59:46, Владимир.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61811/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61811/topic7149/</guid>
			<pubDate>Mon, 07 Feb 2022 09:59:46 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61809/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_24OMc6sr" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />Дело в том, что нештатно останавливается. Если OnStop возвращает 0, сразу за ней выполняется WaitForSingleObject(main, 0), возвращаясь немедленно из-за нулевого таймаута, и сразу же TerminateThread. Там потом еще уведомление главному окну посылается. Видимо, какие-то сопли после этого всего остаются.<br />=============<br />Получается с той или иной долей вероятности можно налететь на такое при любом значении в return и даже без него? <br />
			<i>07.02.2022 09:12:13, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61809/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61809/topic7149/</guid>
			<pubDate>Mon, 07 Feb 2022 09:12:13 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61808/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_8fQJfVkf" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a>, &nbsp;Я понимаю но меня, как старого программиста, просто корёжит от необходимости что-либо делать в прерывании. На то оно и прерывание, чтобы быстренько отреагировать, установить какие-то флаги и быстренько оттуда умотать. А потому и логически, и физически, завершающие операции нужно бы делать именно в мейне, а в OnStop просто сбрасывать флаг бесконечного цикла. Но тут имеем: потеря управления - раз, запрет обращаться к функциям основного потока - два. Файловые операции, слава Богу, ещё работают, а вот операции с таблицами Квика - это ещё бабушка надвое сказала. <br />
			<i>07.02.2022 09:08:44, Владимир.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61808/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61808/topic7149/</guid>
			<pubDate>Mon, 07 Feb 2022 09:08:44 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61803/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_gAbTo0sH" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br /><noindex><a href="/user/14299/" target="_blank" rel="nofollow">Владимир</a></noindex>, тут речь именно про return 0 из OnStop, что форсирует прибитие мейна. Логически мы все делаем в OnStop, потом из него выходим и оставляем какой-то таймаут, чтобы мейн успел добежать до своего end, т.е. физически он свое &quot;ничего&quot; делает последним, а логически из ничего и выходит ничего.<br />=============<br /><br /><br />Anton, если Вы подключены к системе СБП от ЦБ и напишете мне в личку номер Вашего мобильника - готов выслать &quot;на пиво&quot; в честь великого праздника души моей, Вами устроенного! <br />
			<i>06.02.2022 23:45:27, Денис.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61803/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61803/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 23:45:27 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61802/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_3JSphT5x" href="/user/14299/" bx-tooltip-user-id="14299">Владимир</a>, тут речь именно про return 0 из OnStop, что форсирует прибитие мейна. Логически мы все делаем в OnStop, потом из него выходим и оставляем какой-то таймаут, чтобы мейн успел добежать до своего end, т.е. физически он свое &quot;ничего&quot; делает последним, а логически из ничего и выходит ничего. <br />
			<i>06.02.2022 23:30:08, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61802/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61802/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 23:30:08 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61801/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			В общем, последнее слово я все-таки оставил за OnStop(), но говорить она будет только тогда, когда main() все свои дела закончит.<br />Итоговый код для &quot;Hello World&quot; получился такой:<br /><br />
====code====
<pre>Stopped = false

-- для имени файла отладки
File_Name_Log_Debugger = "Log_test_OnStop.txt"

-- для сигнала, что main() готово к завершению
Flag_Svetofor = "Green"

function OnStop()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;Stopped = true
&nbsp;&nbsp;&nbsp;while tostring(Flag_Svetofor) == "Red" do 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(0)
&nbsp;&nbsp;&nbsp;end

end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- конец функции обратного вызова OnStop()

function main()

-- Запрещается функции OnStop() остановка скрипта в теле цикла
&nbsp;&nbsp;&nbsp;Flag_Svetofor = "Red"

-- Открывается отладочный файл лога
&nbsp;&nbsp;&nbsp;File_Log_Debugger = io.open(File_Name_Log_Debugger, "w")

&nbsp;&nbsp;&nbsp;while not Stopped do&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if File_Log_Debugger and tostring(File_Log_Debugger) ~= "file (closed)" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File_Log_Debugger:write("Тестовая строка&#92;n")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File_Log_Debugger:flush()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end -- end if

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(0)
&nbsp;&nbsp;&nbsp;end -- end while конец обработки цикла ожидания робота выход по останову&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;File_Log_Debugger:close() -- закрывается файл отладчика&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;Flag_Svetofor = "Green"
&nbsp;&nbsp;&nbsp;
end -- Конец функции main()
</pre>
============= <br />
			<i>06.02.2022 23:30:06, Денис.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61801/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61801/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 23:30:06 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61800/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_PLlXgz3a" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a>, <br />====quote====<br />А вообще я б лучше предложил сделать последним таки мейн.<br /><br />=============<br />Дык я когда-то именно так и пытался делать, но терялось управление - почему, я понял только по Вашим же комментариям, и теперь у меня в OnStop выполняется целая куча действий - в основном, с файлами, а напоследок я убиваю открытые таблицы: получится, нет ли - уже пофиг, и sleep(500) ему в зубы, чтобы особо не раздумывал. Давно уже работает без нареканий. <br />
			<i>06.02.2022 23:16:12, Владимир.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61800/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61800/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 23:16:12 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61799/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_v3nuBnwG" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/15474/" target="_blank" rel="nofollow">Денис</a></noindex> написал:<br />попробую без оператора return<br />=============<br /> Ага, я не заметил, return 0 надо убрать, выше написал почему, квик видит ноль и прибивает мейн немедленно, хотя тот уже и сам хотел завершиться.<br />=============<br /><br />Все, спасибо огромное! Прибил return вообще. Он и не нужен для лечения моего горя, я его как костыль прикручивал. А тут, все вроде, красиво получилось. <br />Что значит совет знающего человека! Я доволен, как слон. Могу двигаться дальше. <br />
			<i>06.02.2022 23:14:56, Денис.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61799/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61799/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 23:14:56 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61797/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Xzpqdfye" href="/user/15474/" bx-tooltip-user-id="15474">Денис</a> написал:<br />попробую без оператора return<br />=============<br />Ага, я не заметил, return 0 надо убрать, выше написал почему, квик видит ноль и прибивает мейн немедленно, хотя тот уже и сам хотел завершиться. <br />
			<i>06.02.2022 23:10:24, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61797/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61797/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 23:10:24 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61796/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_EwUxShYD" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br /><noindex><a href="/user/15474/" target="_blank" rel="nofollow">Денис</a></noindex>, &nbsp;все же в мейне конец чуть иначе предполагался<br />=============<br /><br />И туда вставил, и сюда вставил... Но QUIK все-таки умер. Не так сразу, как раньше но умер. Пока, попробую без оператора return<br /><br />
====code====
<pre>Stopped = false

-- для имени файла отладки
File_Name_Log_Debugger = "Log_test_OnStop.txt"

-- для сигнала, что main() готово к завершению
Flag_Svetofor = "Green"

function OnStop()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;Stopped = true
&nbsp;&nbsp;&nbsp;while tostring(Flag_Svetofor) == "Red" do 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(0)
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;File_Log_Debugger:close() -- закрывается файл отладчика&nbsp;&nbsp;&nbsp;

return 0&nbsp;&nbsp;&nbsp;
end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- конец функции обратного вызова OnStop()

function main()

-- Открывается отладочный файл лога
&nbsp;&nbsp;&nbsp;File_Log_Debugger = io.open(File_Name_Log_Debugger, "w")

&nbsp;&nbsp;&nbsp;while not Stopped do&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flag_Svetofor = "Red"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if File_Log_Debugger and tostring(File_Log_Debugger) ~= "file (closed)" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File_Log_Debugger:write("Тестовая строка&#92;n")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File_Log_Debugger:flush()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end -- end if

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1)
&nbsp;&nbsp;&nbsp;end -- end while конец обработки цикла ожидания робота выход по останову&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;Flag_Svetofor = "Green"
&nbsp;&nbsp;&nbsp;
end -- Конец функции main()</pre>
============= <br />
			<i>06.02.2022 23:08:08, Денис.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61796/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61796/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 23:08:08 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61794/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_XNACKRfK" href="/user/15474/" bx-tooltip-user-id="15474">Денис</a>, &nbsp;все же в мейне конец чуть иначе предполагался<br />
====code====
<pre>function main()

-- Открывается отладочный файл лога
&nbsp;&nbsp; File_Log_Debugger = io.open(File_Name_Log_Debugger, "w")

&nbsp;&nbsp; while not Stopped do&nbsp;&nbsp; 
&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flag_Svetofor = "Red"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if File_Log_Debugger and tostring(File_Log_Debugger) ~= "file (closed)" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File_Log_Debugger:write("Тестовая строка&#92;n")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File_Log_Debugger:flush()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end -- end if

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1)
&nbsp;&nbsp; end -- end while конец обработки цикла ожидания робота выход по останову

&nbsp;&nbsp; Flag_Svetofor = "Green" -- вот сюда его родимого

end -- Конец функции main()</pre>
============= <br />
			<i>06.02.2022 22:58:11, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61794/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61794/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 22:58:11 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61793/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_N7qOLZJd" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br />Сначала скрипт штатно останавливается, при этом никаких ошибок не выдаёт.<br />=============<br />Дело в том, что нештатно останавливается. Если OnStop возвращает 0, сразу за ней выполняется WaitForSingleObject(main, 0), возвращаясь немедленно из-за нулевого таймаута, и сразу же TerminateThread. Там потом еще уведомление главному окну посылается. Видимо, какие-то сопли после этого всего остаются. <br />
			<i>06.02.2022 22:52:58, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61793/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61793/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 22:52:58 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61792/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Итак, благодаря пользователю <noindex><a href="https://forum.quik.ru/user/1222/" target="_blank" rel="nofollow">Anton</a></noindex> (дай бог ему здоровья и хорошего настроения), который дал рецепт, кажется, лекарство мне помогло.<br /><br />Добавил цикл в функцию обратного вызова OnStop(), который ждет сигнала от main(), что все функции цикла выполнены и процесс готов к завершению.<br />В начале цикла main() ставит сигнал красного светофора для OnStop(), а в конце цикла ставит сигнал зеленого светофора для функции OnStop()<br />То есть, если знак светофора - зеленый, то OnStop() может завершиться.<br /><br />Вот так выглядит код с лекарством и у меня пока не получилось добиться зависания QUIK, как это случалось в прежнем варианте:<br /><br />
====code====
<pre>Stopped = false

-- для имени файла отладки
File_Name_Log_Debugger = "Log_test_OnStop.txt"

-- для сигнала, что main() готово к завершению
Flag_Svetofor = "Green"

function OnStop()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;Stopped = true
&nbsp;&nbsp;&nbsp;while tostring(Flag_Svetofor) == "Red" do 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(0)
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;File_Log_Debugger:close() -- закрывается файл отладчика&nbsp;&nbsp;&nbsp;

return 0&nbsp;&nbsp;&nbsp;
end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- конец функции обратного вызова OnStop()

function main()

-- Открывается отладочный файл лога
&nbsp;&nbsp;&nbsp;File_Log_Debugger = io.open(File_Name_Log_Debugger, "w")

&nbsp;&nbsp;&nbsp;while not Stopped do&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flag_Svetofor = "Red"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if File_Log_Debugger and tostring(File_Log_Debugger) ~= "file (closed)" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File_Log_Debugger:write("Тестовая строка&#92;n")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File_Log_Debugger:flush()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end -- end if

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flag_Svetofor = "Green"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1)
&nbsp;&nbsp;&nbsp;end -- end while конец обработки цикла ожидания робота выход по останову&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;
end -- Конец функции main()
</pre>
============= <br />
			<i>06.02.2022 22:51:54, Денис.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61792/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61792/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 22:51:54 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61791/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_0AQA2kiM" href="/user/15474/" bx-tooltip-user-id="15474">Денис</a> написал:<br />Как посигналить? Если Stopped = true<br />=============<br />Да, этот момент уже в коде присутствует и упомянут для полноты. Мониторить не в каждом, но при работе с окнами - да, попытка что-то сделать с окном из мейна, когда OnStop подвешен на цикле - дедлок. Строго говоря, даже проверка перед вызовом такой функции небезопасна, флаг может встать между проверкой и актуальным вызовом (хотя маловероятно).<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_1nZnVHF0" href="/user/15474/" bx-tooltip-user-id="15474">Денис</a> написал:<br />То есть еще один цикл со sleep(0)?<br />=============<br />Да, как по ссылке выше показывал. Это по сути спинлоки за отсутствием нормальной синхронизации в луа, мьютекса или семафора или хоть чего-нибудь.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_sQte1Z0M" href="/user/15474/" bx-tooltip-user-id="15474">Денис</a> написал:<br />в то время, пока в основном потоке OnStop() подвешен на цикле со слипом - операторы main() в дополнительном потоке продолжают выполняться?<br />=============<br />Да, но в силу устройства луа нужен какой-нибудь сишный вызов в цикле ожидания (в данном случае слип), иначе все встает.<br /><br />А вообще я б лучше предложил сделать последним таки мейн, вот с этой всей синхронизацией на выходе, пусть вся логика отработает как требуется, в том числе последнее полезное действие в OnStop, но чтобы последнее слово было за мейном, даже просто голый return. Так надежнее, будет одна точка выхода на все случаи. <br />
			<i>06.02.2022 22:49:47, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61791/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61791/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 22:49:47 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61790/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Вероятно, я с таким не сталкивался, потому что никогда не использовал return 0 в OnStop. Минимальное значение не менее 100 указываю. <br />
			<i>06.02.2022 22:34:40, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61790/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61790/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 22:34:40 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61789/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Iyafxqzd" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br />Так зависает не во время работы скрипта. Сначала скрипт штатно останавливается, при этом никаких ошибок не выдаёт. Затем скрипт уже перестаёт запускаться. И при попытке вызове какого-нибудь меню квик вешается.<br />=============<br /><br />Все верно. Именно, такое горе и происходит. Функции закрытия файлов и выталкивания буфера - это системные функции. Вполне, допускаю, что они греховно остаются частично работать в системе после остановки скрипта. <br />
			<i>06.02.2022 22:32:19, Денис.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61789/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61789/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 22:32:19 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61788/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Так зависает не во время работы скрипта. Сначала скрипт штатно останавливается, при этом никаких ошибок не выдаёт. Затем скрипт уже перестаёт запускаться. И при попытке вызове какого-нибудь меню квик вешается. <br />
			<i>06.02.2022 22:28:34, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61788/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61788/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 22:28:34 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как грамотно сделать функцию OnStop() последней в теле скрипта?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message61787/topic7149/">Как грамотно сделать функцию OnStop() последней в теле скрипта?</a></b> <i>Скудное описание функции обратного вызова OnStop() в официальной документации</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_9uj78qm7" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/15474/" target="_blank" rel="nofollow">Денис</a></noindex> написал:<br />после нажатия кнопки &quot;Остановить&quot; скрипт, вроде бы, штатно останавливается - но затем через пять-семь минут при нажатии на любой пункт меню QUIK намертво зависает.<br />=============<br /> Проверил - да, так и есть.<br />Хоть с квиком работаю уже много лет, но на чём квик сейчас застопорился не пойму.<br />=============<br /><br />Ну, я подозреваю, что из-за непредсказуемости происходящего - возникает конфликт с открытием-закрытием файла и записью в него буфера данных. Вот, выше по тексту, один грамотный человек, дай бог ему здоровья, рассказал, как можно этот процесс упорядочить, то есть синхронизировать между потоками. Еще не пробовал его лекарство, но рецепт выглядит внушительно. <br />
			<i>06.02.2022 22:24:56, Денис.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message61787/topic7149/</link>
			<guid>http://forum.quik.ru/messages/forum10/message61787/topic7149/</guid>
			<pubDate>Sun, 06 Feb 2022 22:24:56 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
