Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

lua_share

Sharing data between LUA scripts running in QUIK.

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

Библиотека LUA SHARE

Текущие версии предназначены для работы с QUIK 9.3 x64 и выше с поддержкой версии lua 5.4. Если вам необходима библиотека для работы с более ранними версиями QUIK, вы можете скачать предыдущий релиз из истории релизов.

Скачать: текущий релиз для QUIK 9.X x64

ОПИСАНИЕ:

Библиотека предназначена для обмена данными между lua-скриптами, работающими в разных процессах, а так же в одном процессе, но в разных lua-машинах. Прежде всего, она будет полезна пользователям терминала QUIK.

Комплект состоит из библиотеки lua_share.dll и файла lua_share_boot.lua. Для корректной работы оба файла должны находиться в одном каталоге. Если файл lua_share_boot.lua отсутствует, то библиотека ведет себя несколько иначе, но тоже работает, о чем ниже. Для межпроцессного взаимодействия в комплект так же входит IPC-сервер под названием lua_share_server.exe, lua-скрипт lua_share_server.lua и rpc-библиотека lua_share_rpc.dll.

инициализация:

pascal
package.cpath = getScriptPath() .. "/?.dll"  
sh = require "lua_share"

запись и чтение:

pascal
sh["hello"] = "world" -- ????????????  
val = sh["hello"]     -- ????????????

пространства имен:

pascal
local ns = sh.GetNameSpace("test_name_space")  -- ?????????????? ???????????????????????? ???????? test_name_space  
ns["hello"] = "world" -- ????????????  
val = ns["hello"]     -- ????????????

получение снапшота:

pascal
local ns = sh.GetNameSpace("test_name_space")  -- ?????????????? ???????????????????????? ???????? test_name_space  
ns["hello"] = "hello" -- 1 ????????????????  
ns["world"] = "world" -- 2 ????????????????  
val = ns:DeepCopy() -- ?????????????????? ????????????????

"bootstrap":

Файл lua_share_boot.lua содержит код, который кастомизирует поведение хранилища. В текущей реализации используется сравнение таблиц по содержимому. Например:

pascal
local ns = sh.GetNameSpace("test_name_space")  
ns[{1, 2, {3, 4}}] = "JOHN"  
ns[{1, 2, {3, 4}}] = "DOE"  
tmp = ns[{1, 2, {3, 4}}]

Если файл lua_share_boot.lua существует, то в результате хранилище будет содержать только строку "DOE" и в переменную tmp будет помещено это значение, иначе хранилице будет содержать обе строки: "JOHN" и "DOE", а в переменную tmp будет помещено значение nil, так как ключи {1, 2, {3, 4}} - это deepcopy исходных ключей и разные объекты, хотя и с одинаковым содержимым, а по-умолчанию в lua сравниваются ссылки.

В lua_share_boot.lua можно запрограммировать свое поведение, а добавить свои метаметоды, например __gc. См комментарии в коде lua_share_boot.lua.

IPC:

Существует возможность создавать "удаленные" пространства имен, общие для нескольких запущенных приложений (терминалов QUIK). Для этого необходимо запустить сервер lua_share_server.exe, который хранит общие данные. Сервер запускает lua-скрипт, который хранится в файле lua_share_server.lua и который можно, при желании, кастомизировать. Общее хранилище существует, пока запущен сервер. Удаленное пространство имен создается следующим образом:

pascal
local ns = sh.GetIPCNameSpace("test_name_space")

Способ работы с ним не отличается.

RPC:

Существует возможность вызова удаленной функции на lua_share_server и получить результаты ее выполнения. Тестовая функция testfunc() определена в lua_share_server.lua. Вот пример ее вызова:

pascal
local ns = sh.GetIPCNameSpace("test_name_space")  
a, b, c = ns("testfunc", "a", {1, 2, {3, "b"}}) -- ???????????? ???????????????? IPC ?????????????????? ?????? ??????????????

pre-defined пространства:

"queues" - пространство имен, реализующее очереди (queue). "eventlist" - пространство, реализующее списки событий (аналог waitformultipleobjects). "permanent" - пространство, загружающее себя из файла при старте и записывающее себя в файл при выходе (завершении всех скриптов).

примеры:

Примеры предназначены для запуска в терминале QUIK.

01_test_share_common.lua - общий пример работы с lua_share

02_test_share_producer.lua - пример скрипта "писатель" в цикле обновляет общие данные 03_test_share_consumer.lua - пример скрипта "читатель" читает данные и выводит их в окно сообщений

04_test_share_tablekeys.lua - демонстрация использования таблиц в качестве ключей хранилища

05_test_share_pushqueue.lua - очереди: писатель 06_test_share_popqueue.lua - очерели: читатель

07_test_share_pushevent.lua - eventlist: писатель 08_test_share_popevent.lua - eventlist: читатель

09_test_share_permanent.lua - сохранение данных между запусками скрипта а так же перезапуском QUIK

10_test_share_IPC.lua - пример работы с "удаленным" хранилищем, должен быть запущен lua_share_server.exe

11_test_share_RPC.lua - пример удаленного вызова функции, должен быть запущен lua_share_server.exe и в lua_share_server.lua должна быть определена функция testfunc().