<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: getSecurityInfo из dll]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме getSecurityInfo из dll форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sat, 23 May 2026 21:44:23 +0300</pubDate>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60999/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Спасибо. Ясно.Хорошо бы в отдельную тему вывести описание сборки ! <br />
			<i>08.01.2022 16:39:47, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60999/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60999/topic7046/</guid>
			<pubDate>Sat, 08 Jan 2022 16:39:47 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60983/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_8m1RlZeq" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />6) в папку своего проекта копируете файлы lua.h, luaconf.h, lauxlib.h и полученный luaXX.dll<br />=============<br />поправочка, &quot;и полученный luaXX.lib&quot; <br />
			<i>08.01.2022 12:04:19, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60983/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60983/topic7046/</guid>
			<pubDate>Sat, 08 Jan 2022 12:04:19 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60975/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_xIMpu1qZ" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a> написал:<br />как тогда с 5.4.x правильно собираться, по пунктам<br />=============<br />Ну давайте здесь напишем ) Для любой версии луа<br />1) качаете с lua.org нужную версию луа в зипе<br />2) из зипа берете lua.h, luaconf.h, lauxlib.h, остальной зип можно выбросить<br />3) в папке с квиком создаете файл makelib.bat со следующим содержимым<br />
====code====
<pre>@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-4" %%1 in ('dumpbin /exports %1') do (
&nbsp;&nbsp;&nbsp;&nbsp;set /a ordinal=%%1 2&#62;nul
&nbsp;&nbsp;&nbsp;&nbsp;set /a hint=0x%%2 2&#62;nul
&nbsp;&nbsp;&nbsp;&nbsp;set /a rva=0x%%3 2&#62;nul
&nbsp;&nbsp;&nbsp;&nbsp;if !ordinal! equ %%1 if !hint! equ 0x%%2 if !rva! equ 0x%%3 set exports=!exports! /export:%%4
)
for /f %%i in ("%1") do set dllpath=%%~dpni
start lib /out:%dllpath%.lib /machine:x64 /def: %exports%</pre>
=============
4) запускаете Visual Studio Command Prompt x64 release, переходите в папку с квиком, выполняете команду (скажем, для луа 5.3)<br />
====code====
<pre>makelib lua53.dll</pre>
=============
5) в папке квика появляются файлы lua53.lib и lua53.exp. Файл .exp выбрасываете, он нам не нужен<br />6) в папку своего проекта копируете файлы lua.h, luaconf.h, lauxlib.h и полученный luaXX.dll<br />7) в своем проекте инклюдите как обычно<br />
====code====
<pre>extern "C" {
#include "luaconf.h"
#include "lua.h"
#include "lauxlib.h"
}</pre>
=============
8) и указываете, с чем линковаться<br />
====code====
<pre>#pragma comment(lib, "luaXX.lib")</pre>
=============
Все. <br />
			<i>08.01.2022 01:23:25, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60975/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60975/topic7046/</guid>
			<pubDate>Sat, 08 Jan 2022 01:23:25 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60973/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Y3Pfg26D" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />это был весь луа в виде статической библиотеки<br />=============<br />Все верно ! А есть где прочитать, как тогда с 5.4.x правильно собираться, по пунктам ? А то про dumpbin вообще не понял... <br />
			<i>07.01.2022 23:13:29, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60973/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60973/topic7046/</guid>
			<pubDate>Fri, 07 Jan 2022 23:13:29 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60972/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_6X1v9ouW" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a>, &nbsp;сдается мне, вы собирали весь луа вместе со своим кодом (и в версии 5.3 у вас собирался статический луа, а в 5.4 динамический, поэтому получилась длл и более-менее правильная библиотека экспорта). От луа нужны только три заголовка luaconf.h, lua.h, lauxlib.h, все остальное включать в проект не надо, линковаться надо с luaXX.lib, полученной из luaXX.dll из состава квика с помощью dumpbin. <br />
			<i>07.01.2022 21:39:46, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60972/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60972/topic7046/</guid>
			<pubDate>Fri, 07 Jan 2022 21:39:46 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60970/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_I1t0L1aM" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a> написал:<br />в новой версии появилась помимо lua54.lib еще и lua54.dll<br />=============<br />Как это появилась. Собственно luaXX.dll это и есть луа в составе квика. Вот тут возникает вопрос, а откуда у вас была lua53.lib, может это был весь луа в виде статической библиотеки, а не просто список экспорта от длл, как должно быть? <br />
			<i>07.01.2022 21:09:19, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60970/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60970/topic7046/</guid>
			<pubDate>Fri, 07 Jan 2022 21:09:19 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60969/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Пересобрал свою dll на 5.4.2 - и все заработало как часы! Дело оказалось только в версии -поверить не могу ! <br /><br />Кстати, в новой версии появилась помимо lua54.lib еще и lua54.dll. А смысл ? <br />
			<i>07.01.2022 21:01:38, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60969/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60969/topic7046/</guid>
			<pubDate>Fri, 07 Jan 2022 21:01:38 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60961/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_N3aD7eYb" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a> написал:<br />у меня обычный lua_call, а в примере lua_callk<br />=============<br />Это одно и то же, lua_call просто макрос над lua_callk с теми же нулями в конце. <br />
			<i>07.01.2022 14:29:32, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60961/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60961/topic7046/</guid>
			<pubDate>Fri, 07 Jan 2022 14:29:32 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60960/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_11XixsEX" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />Собственно, можете собрать, там внешних зависимостей нет<br />=============<br />Буду разбираться ! А еще у меня обычный lua_call, а в примере lua_callk. Есть какие-то преимущества ? <br />
			<i>07.01.2022 14:17:16, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60960/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60960/topic7046/</guid>
			<pubDate>Fri, 07 Jan 2022 14:17:16 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60955/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_eQuSKEVc" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a> написал:<br />под 5.3.5<br />=============<br />не собирал. Уверен, что будет работать. Собственно, можете собрать, там внешних зависимостей нет, только пути к заголовкам поменять.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_uPH6x4OJ" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a> написал:<br />Там же должен быть luaopen_...<br />=============<br />Это если грузить через require. Я загружаю длл так<br />
====code====
<pre>package.loadlib(getScriptPath()..'&#92;&#92;dllname.dll', 'load')()
</pre>
=============
, поэтому имя функции не имеет значения. <br />
			<i>07.01.2022 12:27:41, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60955/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60955/topic7046/</guid>
			<pubDate>Fri, 07 Jan 2022 12:27:41 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60952/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_ciE6bw3y" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />Вот глядите, примерно нечто в том же роде накропал<br />=============<br />Этот пример и под 5.3.5 работает без сбоев ? Одна надежда, что дело в версии...<br /><br />И еще эта строчка &quot;extern &quot;C&quot; int __declspec(dllexport) load(lua_State * s)&quot; это что ? Там же должен быть luaopen_... <br />
			<i>06.01.2022 23:39:51, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60952/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60952/topic7046/</guid>
			<pubDate>Thu, 06 Jan 2022 23:39:51 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60938/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_Z5vErwf9" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a>, &nbsp;у вас все же где-то косячок-с. Вот глядите, примерно нечто в том же роде накропал (попроще) - ничего не виснет.<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><br />
====code====
<pre>#ifndef _UNICODE
#define _UNICODE
#endif

#ifndef UNICODE
#define UNICODE
#endif

#ifndef _MT
#define _MT
#endif

#ifndef NOMINMAX
#define NOMINMAX
#endif

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN
#endif

#ifndef WINVER
#define WINVER 0x0600
#endif

#undef _WIN32_WINNT
#define _WIN32_WINNT WINVER

#include &#60;cstddef&#62;
#include &#60;cstdarg&#62;
#include &#60;cstdio&#62;

extern "C"
{
#include "include/lua/54/luaconf.h"
#include "include/lua/54/lua.h"
#include "include/lua/54/lauxlib.h"
}

#include &#60;share.h&#62;
#include &#60;Windows.h&#62;
#include &#60;Shlwapi.h&#62;

#pragma comment(lib, "lua54.lib")
#pragma comment(lib, "shlwapi.lib")

extern "C" ::IMAGE_DOS_HEADER __ImageBase;

struct Logger
{

&nbsp;&nbsp;&nbsp;Logger(void) throw()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: _f(nullptr)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::InitializeCriticalSectionAndSpinCount(&#38;_cs, 1000);
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;~Logger(void)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::DeleteCriticalSection(&#38;_cs);
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;int Init(lua_State * s)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(_f)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ::luaL_error(s, "Logger already initialized");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wchar_t buf&#91;MAX_PATH&#93;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!::GetModuleFileNameW(reinterpret_cast&#60;HMODULE&#62;(&#38;::__ImageBase), buf, MAX_PATH))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ::luaL_error(s, "GetModuleFileName failed (%08X)", ::GetLastError());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!::PathRemoveFileSpecW(buf))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ::luaL_error(s, "PathRemoveFileSpec failed (%08X)", ::GetLastError());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!::PathAppendW(buf, L"qtest.dll.log"))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ::luaL_error(s, "PathAppend failed (%08X)", ::GetLastError());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_f = ::_wfsopen(buf, L"w", _SH_DENYWR);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!_f)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ::luaL_error(s, "_wfsopen failed (%d)", ::_errno());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Info("Log created");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;void Close(void) throw()
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(_f)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Info("Log closed");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::fclose(_f);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_f = nullptr;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;void Info(const char * fmt, ...)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_list vl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_start(vl, fmt);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_Message('I', fmt, vl);
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;void Warning(const char * fmt, ...)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_list vl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_start(vl, fmt);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_Message('W', fmt, vl);
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;void Error(const char * fmt, ...)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_list vl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_start(vl, fmt);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_Message('E', fmt, vl);
&nbsp;&nbsp;&nbsp;}

private:

&nbsp;&nbsp;&nbsp;Logger(const Logger &#38;);
&nbsp;&nbsp;&nbsp;Logger(Logger &#38;&#38;);
&nbsp;&nbsp;&nbsp;Logger &#38; operator=(const Logger &#38;);
&nbsp;&nbsp;&nbsp;Logger &#38; operator=(Logger &#38;&#38;);

&nbsp;&nbsp;&nbsp;void __declspec(noinline) _Message(char evt, const char * fmt, va_list vl)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(_f)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::EnterCriticalSection(&#38;_cs);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::SYSTEMTIME st;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::GetLocalTime(&#38;st);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::fprintf_s(_f, "%02u.%02u.%02u.%03u &#91;%08u&#93; %c: ",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.wHour, st.wMinute, st.wSecond, st.wMilliseconds,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::GetCurrentThreadId(), evt);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::vfprintf_s(_f, fmt, vl);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::fprintf_s(_f, "&#92;n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::fflush(_f);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::LeaveCriticalSection(&#38;_cs);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;::CRITICAL_SECTION _cs;
&nbsp;&nbsp;&nbsp;::FILE * _f;

};

struct Event
{

&nbsp;&nbsp;&nbsp;Event(void) throw()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: _h(NULL)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;~Event(void)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close();
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;int Create(lua_State * s, const wchar_t * name = nullptr)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(_h)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ::luaL_error(s, "Event already initialized");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE h = ::CreateEventW(nullptr, TRUE, FALSE, name);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!h)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ::luaL_error(s, "CreateEvent failed (%08X)", ::GetLastError());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_h = h;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;void Close(void) throw()
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE h = _h;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_h = NULL;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(h)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::CloseHandle(h);
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;void Set(void) throw()
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::SetEvent(_h);
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;void Reset(void) throw()
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::ResetEvent(_h);
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;HANDLE GetHandle(void) const throw()
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return _h;
&nbsp;&nbsp;&nbsp;}

private:

&nbsp;&nbsp;&nbsp;Event(const Event &#38;);
&nbsp;&nbsp;&nbsp;Event(Event &#38;&#38;);
&nbsp;&nbsp;&nbsp;Event &#38; operator=(const Event &#38;);
&nbsp;&nbsp;&nbsp;Event &#38; operator=(Event &#38;&#38;);

&nbsp;&nbsp;&nbsp;HANDLE _h;

};

struct Timer
{

&nbsp;&nbsp;&nbsp;Timer(void) throw()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: _h(NULL)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;~Timer(void)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close();
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;int Init(lua_State * s, unsigned int period, long long delay = 100000000, const wchar_t * name = nullptr)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(_h)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ::luaL_error(s, "Timer already initialized");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE h = ::CreateWaitableTimerW(nullptr, FALSE, name);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!h)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ::luaL_error(s, "CreateWaitableTimer failed (%08X)", ::GetLastError());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::LARGE_INTEGER li;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;li.QuadPart = -delay;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!::SetWaitableTimer(h, &#38;li, period, nullptr, nullptr, FALSE))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD e = ::GetLastError();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::CloseHandle(h);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ::luaL_error(s, "SetWaitableTimer failed (%08X)", e);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_h = h;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;void Close(void) throw()
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE h = _h;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_h = NULL;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(h)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::CancelWaitableTimer(h);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::CloseHandle(h);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;HANDLE GetHandle(void) const throw()
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return _h;
&nbsp;&nbsp;&nbsp;}

private:

&nbsp;&nbsp;&nbsp;Timer(const Timer &#38;);
&nbsp;&nbsp;&nbsp;Timer(Timer &#38;&#38;);
&nbsp;&nbsp;&nbsp;Timer &#38; operator=(const Timer &#38;);
&nbsp;&nbsp;&nbsp;Timer &#38; operator=(Timer &#38;&#38;);

&nbsp;&nbsp;&nbsp;HANDLE _h;

};

static ::Logger logger;
static ::Event stopevent;
static ::Timer timer;

static int qOnStop(lua_State *)
{
&nbsp;&nbsp;&nbsp;::logger.Info("OnStop()");
&nbsp;&nbsp;&nbsp;::stopevent.Set();
&nbsp;&nbsp;&nbsp;return 0;
}

static int qOnParam(lua_State * s)
{
&nbsp;&nbsp;&nbsp;const char * s1 = ::lua_tolstring(s, -2, nullptr);
&nbsp;&nbsp;&nbsp;const char * s2 = ::lua_tolstring(s, -1, nullptr);
&nbsp;&nbsp;&nbsp;::logger.Info("OnParam(%s, %s)", s1, s2);
&nbsp;&nbsp;&nbsp;return 0;
}

static int qmain(lua_State * s)
{
&nbsp;&nbsp;&nbsp;::logger.Info("Enter qmain()");
&nbsp;&nbsp;&nbsp;::timer.Init(s, 1500);
&nbsp;&nbsp;&nbsp;for(;;)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE waitarray&#91;&#93; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::stopevent.GetHandle(),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::timer.GetHandle(),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(::WaitForMultipleObjects(_countof(waitarray), waitarray, FALSE, INFINITE))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case (WAIT_OBJECT_0 + 0): // stop event
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::logger.Info("Stop event is set, main about to exit");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::timer.Close();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::stopevent.Close();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::logger.Info("Leave qmain()");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case (WAIT_OBJECT_0 + 1): // timer
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::lua_getglobal(s, "getInfoParam");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::lua_pushstring(s, "SERVERTIME");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::lua_callk(s, 1, 1, 0, nullptr);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::logger.Info("Timer event, server time is %s", ::lua_tolstring(s, -1, nullptr));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::lua_pop(s, 1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//case (WAIT_OBJECT_0 + 2):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ::luaL_error(s, "WaitForMultipleObjects failed (%08X)", ::GetLastError());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;}
}

extern "C" int __declspec(dllexport) load(lua_State * s)
{
&nbsp;&nbsp;&nbsp;::logger.Init(s);
&nbsp;&nbsp;&nbsp;::stopevent.Create(s);
&nbsp;&nbsp;&nbsp;::lua_pushcclosure(s, ::qmain, 0); ::lua_setglobal(s, "main");
&nbsp;&nbsp;&nbsp;::lua_pushcclosure(s, ::qOnStop, 0); ::lua_setglobal(s, "OnStop");
&nbsp;&nbsp;&nbsp;::lua_pushcclosure(s, ::qOnParam, 0); ::lua_setglobal(s, "OnParam");
&nbsp;&nbsp;&nbsp;return 0;
}
</pre>
=============
</td></tr></tbody></table> <br />
			<i>06.01.2022 00:14:37, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60938/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60938/topic7046/</guid>
			<pubDate>Thu, 06 Jan 2022 00:14:37 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60935/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Перенес все в main, передаю стэйт как параметр для вызова функции quik и все равно если перехват OnParam подключен в dll,то подвешивает quik в непредсказуемые моменты. В режиме отладки отловил тут акцесс виолэйшн в lua53.dll. Если OnParam не перехватывать, то все идеально. Что же еще может быть тогда ? <br />
			<i>05.01.2022 21:00:59, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60935/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60935/topic7046/</guid>
			<pubDate>Wed, 05 Jan 2022 21:00:59 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60925/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_kGc1lRiG" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />Мне вот мысль пришла, а какой транспорт используется?<br />=============<br />На стороне приложения просто SetEvent (именной, ранее созданный), на стороне quik - сервер с бесконечным WaitForMultipleObject, сработал, выполнил функцию quik, данные в общую память и ответил приложению, там соответственно WaitForSingleObject принял ответ, данные забрал и по новой. Сбой только при включении OnParam... <br />
			<i>05.01.2022 17:02:22, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60925/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60925/topic7046/</guid>
			<pubDate>Wed, 05 Jan 2022 17:02:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60912/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Yf8BK6QU" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a> написал:<br />Похоже, что разные стэйты не такие уж и независимые.<br />=============<br />Вы их выведите в лог (printf(&quot;%p\n&quot;, state)) и посмотрите. Так-то они действительно не совсем независимые, второй произведен от первого и у них общее глобальное пространство. Но блочить это не должно.<br /><br />Мне вот мысль пришла, а какой транспорт используется? Если пайп, там очень легко устроить дедлок, когда в две стороны передача идет. Т.к. пайп с сообщениями блокируется, когда вторая сторона не полностью прочитала сообщение. Если она в этот момент попытается что-то отправить, все встанет колом. <br />
			<i>05.01.2022 16:02:44, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60912/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60912/topic7046/</guid>
			<pubDate>Wed, 05 Jan 2022 16:02:44 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60908/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_vSnpZhAR" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />Вот в таком виде перестанет виснуть?<br />=============<br />Нет, повисает также. Похоже, что разные стэйты не такие уж и независимые. Буду переделывать на выполнение команд из main. <br />
			<i>05.01.2022 15:13:01, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60908/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60908/topic7046/</guid>
			<pubDate>Wed, 05 Jan 2022 15:13:01 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60880/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_LmhdRw8D" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a> написал:<br />пока не включен обработчик OnParam<br />=============<br />Все же поправьте его для начала. Вот в таком виде перестанет виснуть?<br />
====code====
<pre>static int OnParam_from_lua(lua_State* L) {&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;data_receive_time = GetTickCount64();&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}</pre>
============= <br />
			<i>05.01.2022 09:04:43, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60880/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60880/topic7046/</guid>
			<pubDate>Wed, 05 Jan 2022 09:04:43 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60874/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_YuezYtu9" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />Если вдруг она уже захвачена и мейн из своего потока еще раз пытается захватить, будет рекурсивный захват, что ок, а если мейн держит секцию и ее пытается захватить другой поток, будет дедлок. Возможно, отсюда ноги растут.<br />=============<br />Ну так пока не включен обработчик OnParam со своим стейтом, то все ок и за 1 сек. lua_call с этим global_lua_state успешно отрабатывает более 26 тыс.раз. Только включаю обработчика, то может зависнуть на 10 вызове, а может на 1000-м... Хотя стайты точно разные в main и в обработчике. Если в main стэйт уже пришел, то адрес его уже не меняется. Сейчас из main я его не трогаю он используется только из одного потока, типа моего эвент-сервера и все хорошо до подключения обработчика...Дедлока, по идее, не может быть ! <br />
			<i>04.01.2022 23:37:51, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60874/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60874/topic7046/</guid>
			<pubDate>Tue, 04 Jan 2022 23:37:51 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60873/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_LIGOJHKp" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a> написал:<br />global_lua_state = L;<br />=============<br />Вот это надо убрать совершенно точно и внутри мейна использовать L напрямую. Уже убрав global_lua_state увидите, где еще этот стейт использовался. Затем, как понимаю, работал еще один поток, который дергал луа через global_lua_state, принадлежащий потоку мейна. На входе в любую lua_* функцию идет захват критической секции. Если вдруг она уже захвачена и мейн из своего потока еще раз пытается захватить, будет рекурсивный захват, что ок, а если мейн держит секцию и ее пытается захватить другой поток, будет дедлок. Возможно, отсюда ноги растут.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_YIxmNmt2" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a> написал:<br />lua_settop(L, 0); &nbsp; &nbsp; &nbsp; &nbsp;data_receive_time = GetTickCount64(); &nbsp; &nbsp; &nbsp; &nbsp;return 1;<br />=============<br />Побочно: некрасиво, чистим стек и return 1, т.е. &quot;эй луа, тут на стеке один элемент возвращен&quot;. Хотя по идее луа должен бы это съесть, но может и не ест. <br />
			<i>04.01.2022 22:55:15, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60873/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60873/topic7046/</guid>
			<pubDate>Tue, 04 Jan 2022 22:55:15 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60872/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_5jPewvf0" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />Все остальные колбеки в текущей реализации получают другой стейт <br />=============<br />Тогда у меня что-то не сходится: <br /><br />&quot;//это main<br />static int main_from_lua(lua_State* L) { &nbsp; &nbsp; &nbsp; global_lua_state = L;<br />...<br /><br />//это OnParam<br />static int OnParam_from_lua(lua_State* L) { &nbsp; &nbsp; &nbsp; &nbsp;lua_settop(L, 0); &nbsp; &nbsp;<br /> &nbsp; &nbsp;data_receive_time = GetTickCount64(); &nbsp; &nbsp;<br /> &nbsp; &nbsp;return 1;<br />}<br />&quot;<br /><br />Т.е. все команды шлются через global_lua_state полученный из main в момент запуска скрипта. И если убрать обработчика OnParam, то все работает, подключаю OnParam - начинает вешать quik, хотя там свой state должен быть... <br />
			<i>04.01.2022 22:35:24, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60872/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60872/topic7046/</guid>
			<pubDate>Tue, 04 Jan 2022 22:35:24 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60871/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_PVn45G1O" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a> написал:<br />Но в обычном порядке state в main попадает только один раз при запуске скрипта, как я понимаю ? А в callback-ах не тот де самый state приходит ?<br />=============<br />Да, на входе в мейн вы получаете стейт отдельного потока и он жив, пока мейн не вернулся, то есть действительно стейт мейна передается один раз на входе (в мейн). Все остальные колбеки в текущей реализации получают другой стейт (для всех колбеков <I>одного скрипта</I> один и тот же), но тут никаких гарантий нет, что так будет всегда, лучше сразу предположить, что у каждого колбека может быть свой отдельный стейт и не создавать себе на будущее проблем. <br />
			<i>04.01.2022 22:17:04, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60871/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60871/topic7046/</guid>
			<pubDate>Tue, 04 Jan 2022 22:17:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60870/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_p3qO2G37" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />WaitForMultipleObjects вполне может быть в мейне<br />=============<br />Не ожидал. Я как раз отдельный поток выделил - типа сервер где обрабатывается WaitForMultipleObjects. А если все в main, думал что quik зависнет в ожидании... Но в обычном порядке state в main попадает только один раз при запуске скрипта, как я понимаю ? А в callback-ах не тот де самый state приходит ? <br />
			<i>04.01.2022 22:04:54, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60870/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60870/topic7046/</guid>
			<pubDate>Tue, 04 Jan 2022 22:04:54 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60868/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Tk4ePbN8" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a> написал:<br />есть возможность без нового потока &quot;дергать&quot; lua_State ?<br />=============<br />Конечно, вам уже квик создал поток для мейна и стейт для него (почти таким же куском кода, как по ссылке выше я показывал). WaitForMultipleObjects вполне может быть в мейне, и использовать для дерганья луа он должен стейт, переданный в мейн. Также можно завести событие (CreateEvent) и добавить его в список ожидаемых объектов в мейне, и в колбеке OnStop ставить его (SetEvent), мейн в этом случае пойдет на выход вместо очередной итерации ожидания. Может быть, как-то посигналив вашей проге сначала, что банкет окончен. А в обратную сторону, как понимаю, из колбеков, используйте стейты, передаваемые в эти колбеки. Есть еще вариант создать в мейне очередь сообщений и использовать виндовые сообщения вместо объектов синхронизации. Оно малость медленнее (несущественно), но может быть проще в некотором смысле, т.к. получается по сути готовый конечный автомат и запутаться в нем меньше шансов. <br />
			<i>04.01.2022 21:46:04, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60868/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60868/topic7046/</guid>
			<pubDate>Tue, 04 Jan 2022 21:46:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60864/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_AEFmlfTu" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />Если заводится свой поток в длл, который будет дергать луа, нужно, да, создать для него стейт через lua_newthread<br />=============<br />А что, есть возможность без нового потока &quot;дергать&quot; lua_State ? Просто у меня общая dll и для связи с quik и для связи с моей прогой. И из своей проги просто отправлял команду в dll, где по WaitForMultipleObjects как раз через ранее сохраненный глобальный lua_State, dll отправляла команду в quik. <br />
			<i>04.01.2022 21:18:48, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60864/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60864/topic7046/</guid>
			<pubDate>Tue, 04 Jan 2022 21:18:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60855/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_vKNsLMT6" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a> написал:<br />самому функции quik вызывать<br />=============<br />Ну вообще-то длл это просто набор функций, своей жизнью она по дизайну не живет. Соответственно любая деятельность происходит в ответ на колбек, а в колбек стейт передается. Если заводится свой поток в длл, который будет дергать луа, нужно, да, создать для него стейт через lua_newthread, я показывал как-то <noindex><a href="https://forum.quik.ru/messages/forum10/message43037/topic5174/#message43037" target="_blank" rel="nofollow">как именно</a></noindex>. Но тут имейте в виду, что ваш поток должен завершиться при любом раскладе (нажата кнопка стоп, завершился мейн по своей инициативе, квик прибил скрипт за ошибку) до того, как квик прибьет объект скрипта, иначе выхватите акцесс виолейшен и обвалите весь квик. <br />
			<i>04.01.2022 18:48:41, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60855/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60855/topic7046/</guid>
			<pubDate>Tue, 04 Jan 2022 18:48:41 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60854/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_fhzWUiF6" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />Именно. Не надо &nbsp;сохранять стейт в глобальную переменную, в каждом колбеке (включая мейн) &nbsp;надо использовать тот стейт, что в эту функцию передан.<br />=============<br />А как тогда правильно самому функции quik вызывать ? lua_newthread ? <br />
			<i>04.01.2022 18:40:41, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60854/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60854/topic7046/</guid>
			<pubDate>Tue, 04 Jan 2022 18:40:41 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60853/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_qnPLE4MD" href="/user/15306/" bx-tooltip-user-id="15306">BVladimir</a> написал:<br />Очевидно, в некоторые моменты происходит одновременные манипуляции со стэком в lua_State из-за чего и сбой.<br />=============<br />Именно. Не надо &nbsp;сохранять стейт в глобальную переменную, в каждом колбеке (включая мейн) &nbsp;надо использовать тот стейт, что в эту функцию передан. <br />
			<i>04.01.2022 18:22:12, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60853/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60853/topic7046/</guid>
			<pubDate>Tue, 04 Jan 2022 18:22:12 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60852/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Разобрался, подвисало все иногда из-за включенной в dll обработке OnParam. Очевидно, в некоторые моменты происходит одновременные манипуляции со стэком в <br />lua_State из-за чего и сбой. Тогда получается, что нужно в разных потоках обрабатывать свои команды и quik события ? Или еще какие варианты ? <br />
			<i>04.01.2022 17:53:52, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60852/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60852/topic7046/</guid>
			<pubDate>Tue, 04 Jan 2022 17:53:52 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>getSecurityInfo из dll</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message60850/topic7046/">getSecurityInfo из dll</a></b> <i>Периодически подвешивает Quik</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			С НГ, форумчане !<br /><br />Из своей dll вызываю в цикле запрос getSecurityInfo<br />&quot;<br />lua_getglobal(global_lua_state, &quot;getSecurityInfo&quot;);<br />lua_pushstring(global_lua_state, class_code);<br />lua_pushstring(global_lua_state, sec_code);lua_call(global_lua_state, 2, 1);<br />&quot;<br /><br />собственно, по всем тикерам в одном цикле. И сейчас вдруг, иногда, в непредсказуемые моменты подвисает lua_call и, соответственно, подвешивает и сам Quik. Версия 5.3.5. Этом у меня тут что-то напутано или что еще может быть - куда копать ? <br />
			<i>04.01.2022 16:52:18, BVladimir.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message60850/topic7046/</link>
			<guid>http://forum.quik.ru/messages/forum10/message60850/topic7046/</guid>
			<pubDate>Tue, 04 Jan 2022 16:52:18 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
