<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: DLL  и Lua]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме DLL  и Lua форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sat, 02 May 2026 22:13:59 +0300</pubDate>
		<item>
			<title>DLL  и Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message37803/topic4484/">DLL  и Lua</a></b> <i>Ошибка</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			забыл, lua_newthread на стек добавит поток. запоминаем в регистр чтобы ГЦ не потер его(заодним со стека уберем, ни к чему он там). luaL_ref(L, LUA_REGISTRYINDEX); <br />
			<i>03.05.2019 21:33:19, Антон (band).</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message37803/topic4484/</link>
			<guid>http://forum.quik.ru/messages/forum10/message37803/topic4484/</guid>
			<pubDate>Fri, 03 May 2019 21:33:19 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>DLL  и Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message37802/topic4484/">DLL  и Lua</a></b> <i>Ошибка</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_jdnSXqtu" href="/user/13026/" bx-tooltip-user-id="13026">SnamI</a>, в своем потоке лучше не делать lua_newthread
====code====
<pre>static void test(lua_State *L)
{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;using namespace std::chrono_literals;
&nbsp;&nbsp;&nbsp;&nbsp;for (size_t i = 0; i &#60; 5000; i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_getglobal(L, "message");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pushstring(L, "test");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pcall(L, 1, 0, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::this_thread::sleep_for(1ms);
&nbsp;&nbsp;&nbsp;&nbsp;}
}

static int forLua_StartProgramm(lua_State *L)
{
&nbsp;&nbsp;&nbsp;&nbsp;lua_State *tL = lua_newthread(L);
&nbsp;&nbsp;&nbsp;&nbsp;std::thread thr(test, tL);
&nbsp;&nbsp;&nbsp;&nbsp;thr.detach();
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}</pre>
=============
есть основной поток квика. есть поток скрипта(функция main). если создать свой поток и начать писать в стек с которым идет паралельная работа (в этих 2х потоках) без синхронизации пойдет одновременная запись. стек будет битый и это приводит к таким ошибкам. <br />
			<i>03.05.2019 21:26:42, Антон (band).</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message37802/topic4484/</link>
			<guid>http://forum.quik.ru/messages/forum10/message37802/topic4484/</guid>
			<pubDate>Fri, 03 May 2019 21:26:42 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>DLL  и Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message37801/topic4484/">DLL  и Lua</a></b> <i>Ошибка</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Хотя, вроде, разобрался.<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>static void test(lua_State *L)
{
&nbsp;&nbsp;&nbsp;lua_State *tL = lua_newthread(L);
&nbsp;&nbsp;&nbsp;L = lua_open();
&nbsp;&nbsp;&nbsp;luaL_openlibs(L);

&nbsp;&nbsp;&nbsp;lua_getglobal(tL, "message");
&nbsp;&nbsp;&nbsp;int callRef = luaL_ref(tL, LUA_REGISTRYINDEX);

&nbsp;&nbsp;&nbsp;for (size_t i = 0; i &#60; 100000; i++)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_rawgeti(tL, LUA_REGISTRYINDEX, callRef);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pushstring(tL, "test");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pcall(tL, 1, 0, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(1);
&nbsp;&nbsp;&nbsp;}
}</pre>
=============
</td></tr></tbody></table><br /><br />Получается любой луа стек, приходящий от скрипта, может использоваться Квиком? <br />
			<i>03.05.2019 19:25:39, SnamI.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message37801/topic4484/</link>
			<guid>http://forum.quik.ru/messages/forum10/message37801/topic4484/</guid>
			<pubDate>Fri, 03 May 2019 19:25:39 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>DLL  и Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message37790/topic4484/">DLL  и Lua</a></b> <i>Ошибка</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_ZYxp7NIG" href="/user/1406/" bx-tooltip-user-id="1406">Антон (band)</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/13026/" target="_blank" rel="nofollow">SnamI</a></noindex> написал:<br />std::thread thr(test, L); //Запускает выполнение функции в отдельном потоке<br />=============<br /> Так делать нельзя. Вы в потоке используете стек, который может использовать квик/ваш скрипт.<br />создайте новый луа_стейт под этот поток. запомните куданить в регистр например функцию message. ну и работайте с этим стейтом из потока своего. все будет работать.<br />=============<br />А как новый луа стек будет взаимодействовать со скриптом? Изначально я отталкивался от <noindex><a href="http://www.lua.org/manual/5.1/manual.html#lua_CFunction" target="_blank" rel="nofollow">СFunction</a></noindex> , получается скрипт должен быть сообщать луа стек.<br /><br />Пробовал загружать скрипт, но безрезультатно.<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>static void test()
{
&nbsp;&nbsp;&nbsp;lua_State* L = luaL_newstate();
&nbsp;&nbsp;&nbsp;luaL_openlibs(L);
&nbsp;&nbsp;&nbsp;if (luaL_loadfile(L, "back.lua") ||
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pcall(L, 0, 0, 0)) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;lua_getglobal(L, "message"); 
&nbsp;&nbsp;&nbsp;int callRef = luaL_ref(L, LUA_REGISTRYINDEX);

&nbsp;&nbsp;&nbsp;for (size_t i = 0; i &#60; 10000; i++)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_rawgeti(L, LUA_REGISTRYINDEX, callRef);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pushstring(L, "test");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pcall(L, 1, 0, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(1);
&nbsp;&nbsp;&nbsp;}
} </pre>
=============
</td></tr></tbody></table> <br />
			<i>03.05.2019 12:34:45, SnamI.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message37790/topic4484/</link>
			<guid>http://forum.quik.ru/messages/forum10/message37790/topic4484/</guid>
			<pubDate>Fri, 03 May 2019 12:34:45 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>DLL  и Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message37781/topic4484/">DLL  и Lua</a></b> <i>Ошибка</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_PJT6pqIb" href="/user/13026/" bx-tooltip-user-id="13026">SnamI</a> написал:<br />std::thread thr(test, L); //Запускает выполнение функции в отдельном потоке<br />=============<br />Так делать нельзя. Вы в потоке используете стек, который может использовать квик/ваш скрипт.<br />создайте новый луа_стейт под этот поток. запомните куданить в регистр например функцию message. ну и работайте с этим стейтом из потока своего. все будет работать. <br />
			<i>02.05.2019 03:46:48, Антон (band).</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message37781/topic4484/</link>
			<guid>http://forum.quik.ru/messages/forum10/message37781/topic4484/</guid>
			<pubDate>Thu, 02 May 2019 03:46:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>DLL  и Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message37769/topic4484/">DLL  и Lua</a></b> <i>Ошибка</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Добрый день, не знаю как отладить ошибку при работе DLL. При вызове функции &nbsp;Lua_pcal, компилятор выдаёт следующие: <br /><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><span class="bx-font" style="color:#000000">Вызвано исключение по адресу 0x779FEB83 (ntdll.dll) в info.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00000014. </span></td></tr></tbody></table><br />Dll (на с++)<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>static void test(lua_State *L)
{
&nbsp;&nbsp;&nbsp;for (size_t i = 0; i &#60; 10000; i++)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_getglobal(L, "message");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pushstring(L, "test");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pcall(L, 1, 0, 0);
&nbsp;&nbsp;&nbsp;}
}

static int forLua_StartProgramm(lua_State *L)
{
&nbsp;&nbsp;&nbsp;std::thread thr(test, L); //Запускает выполнение функции в отдельном потоке
&nbsp;&nbsp;&nbsp;thr.detach();
&nbsp;&nbsp;&nbsp;return (0); 
}

static struct luaL_reg ls_lib&#91;&#93; = {
&nbsp;&nbsp; { "StartProgramm", forLua_StartProgramm },
&nbsp;&nbsp; { NULL, NULL }
};

extern "C" LUALIB_API int luaopen_QluaCSharpConnector(lua_State *L) {
&nbsp;&nbsp;&nbsp;luaL_openlib(L, "QluaCSharpConnector", ls_lib, 0);
&nbsp;&nbsp;&nbsp;return 0;
} </pre>
=============
</td></tr></tbody></table>Lua<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>require("QluaCSharpConnector");
 
Run = true; 

function main()
&nbsp;&nbsp;&nbsp;QluaCSharpConnector.StartProgramm();
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;while Run do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(1);
&nbsp;&nbsp;&nbsp;end;
end;
&nbsp;&nbsp;
function OnStop()
&nbsp;&nbsp;&nbsp;Run = false;
end;</pre>
=============
</td></tr></tbody></table><br />Ошибка возникает в случайный момент, может вообще не появится. <br />
			<i>30.04.2019 08:33:02, SnamI.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message37769/topic4484/</link>
			<guid>http://forum.quik.ru/messages/forum10/message37769/topic4484/</guid>
			<pubDate>Tue, 30 Apr 2019 08:33:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
