Тест. Данные в другое приложение.

Страницы: 1
RSS
Тест. Данные в другое приложение.
 
Добрый день,
Неоднократно на форуме интересовались передачей данных из  QUIK  в другое приложение(процесс).
Есть много способов.
Наиболее универсальным является file mapping
Этот метод позволяет обмениваться данными практически любого объема.
Использую этот метод не только для QUIK
------------------
В названии метода есть слово файл.
Уверен, что многие скривятся и скажут, что метод медленно работает.
А вот и нет. .
---------------------------------
Что нам рассказывает об этом методе Майкрософт:
--------------------------
Это объединение содержимого файла с частью виртуального адресного пространства процесса.
Система создает объект сопоставления файлов (также известный как объект раздела) для поддержания этой связи.
Просмотр файла - это часть виртуального адресного пространства, которую процесс использует для доступа к содержимому файла.
Сопоставление файлов позволяет процессу использовать как случайный ввод-вывод (I / O), так и последовательный ввод-вывод.
Это также позволяет процессу эффективно работать с большим файлом данных, таким как база данных,
без необходимости отображать весь файл в памяти.
Несколько процессов также могут использовать файлы, сопоставленные с памятью, для обмена данными.

Процессы считывают данные и записывают в файловое представление, используя указатели, точно так же, как они делали бы с динамически выделяемой памятью.

Использование данного метода повышает эффективность, поскольку файл находится на диске, а представление файла - в памяти.

===========================

Тест для измерения задержки передачи данных из скрипта QUIK  в приложение.

скрипт Теста в SciTe:

Код
paths = "D:/nkarray/"
package.cpath =paths.."?.dll;"
require"nkthread"
----------------------
local T=0; while true do local T1,dt,hms,s,num,HMS,ss=nkmx.gsm(0,T); if T1 then T=T1; print(0.1*dt,hms,s,num,HMS,ss); end  end

фрагмент скрипта в QUIK:
Код
function OnAllTrade(t)
   local c,s=t.class_code,t.sec_code;  local z=ds[c..s]; local num=t.trade_num;
   if z then   local d=z[1]; local n=z[2]; local f=z[3];
      local Ti=t.datetime; local HMS=(60*(60*Ti.hour+Ti.min)+Ti.sec)+0.001*Ti.ms;
      local D=os.date("*t"); local hms=60*(60*(D.hour-shH)+D.min)+D.sec-shS;
      local dt= hms-HMS+n;
      local size=d:Size();
      local T1=d:T(size);   local HMS1=(60*(60*T1.hour+T1.min)+T1.sec)+0.001*T1.ms;
      if HMS==HMS1 and z[4]~=num then
         local dt1=0.01*math.floor(100*dt);   if 0>dt then dt=0 end   count=count+1;   count1=count1+1;
         local m=math.floor(dt)+1;
         local ss=tostring(hms)..","..tostring(s)..",num="..tostring(num)..",size="..tostring(size)..",HMS="..tostring(HMS)..",dt="..tostring(dt1)..",n="..tostring(n)..",m="..tostring(m)..",clock="..(os.clock()-clockOS);
         nkmx.ssm(0,hms,s,num,HMS,ss); -- Log:write(ss.."\n"); Log:flush();
         if sts[m] then sts[m]=sts[m]+1; else sts[m]=1    end
      end
      z[4]=num;
   end
end

результат вывода параметров в SciTe:
Код
0.0   46972   MTSS   4794253307   44952.0   46972,MTSS,num=4794253307,size=2390,HMS=44952.0,dt=2020.0,n=0,m=2021,clock=8.4760000000024
0.1   46972   MTSS   4794253308   44952.0   46972,MTSS,num=4794253308,size=2391,HMS=44952.0,dt=2020.0,n=0,m=2021,clock=8.4760000000024
0.1   46972   FIVE   4794253618   44971.0   46972,FIVE,num=4794253618,size=2756,HMS=44971.0,dt=2001.0,n=0,m=2002,clock=8.4760000000024
0.1   46972   FIVE   4794253619   44971.0   46972,FIVE,num=4794253619,size=2757,HMS=44971.0,dt=2001.0,n=0,m=2002,clock=8.4760000000024
0.1   46972   FIVE   4794253620   44971.0   46972,FIVE,num=4794253620,size=2758,HMS=44971.0,dt=2001.0,n=0,m=2002,clock=8.4760000000024
0.1   46972   FIVE   4794253621   44971.0   46972,FIVE,num=4794253621,size=2759,HMS=44971.0,dt=2001.0,n=0,m=2002,clock=8.4760000000024
0.1   46972   MTSS   4794253982   44990.0   46972,MTSS,num=4794253982,size=2394,HMS=44990.0,dt=1982.0,n=0,m=1983,clock=8.4760000000024
0.1   46972   MTSS   4794255354   45061.0   46972,MTSS,num=4794255354,size=2396,HMS=45061.0,dt=1911.0,n=0,m=1912,clock=8.4760000000024
0.1   46972   MTSS   4794255355   45061.0   46972,MTSS,num=4794255355,size=2397,HMS=45061.0,dt=1911.0,n=0,m=1912,clock=8.4760000000024
0.1   46972   MTSS   4794255356   45061.0   46972,MTSS,num=4794255356,size=2398,HMS=45061.0,dt=1911.0,n=0,m=1912,clock=8.4760000000024
0.1   46972   MTSS   4794255903   45095.0   46972,MTSS,num=4794255903,size=2402,HMS=45095.0,dt=1877.0,n=0,m=1878,clock=8.4770000000026
0.1   46972   MTSS   4794255904   45095.0   46972,MTSS,num=4794255904,size=2403,HMS=45095.0,dt=1877.0,n=0,m=1878,clock=8.4770000000026
0.1   46972   FIVE   4794256157   45107.0   46972,FIVE,num=4794256158,size=2763,HMS=45107.0,dt=1865.0,n=0,m=1866,clock=8.4770000000026
0.1   46972   FIVE   4794256158   45107.0   46972,MTSS,num=4794256215,size=2405,HMS=45110.0,dt=1862.0,n=0,m=1863,clock=8.4770000000026
0.1   46972   MTSS   4794256215   45110.0   46972,MTSS,num=4794256215,size=2405,HMS=45110.0,dt=1862.0,n=0,m=1863,clock=8.4770000000026
0.1   46972   MTSS   4794256220   45111.0   46972,MTSS,num=4794256220,size=2407,HMS=45111.0,dt=1861.0,n=0,m=1862,clock=8.4770000000026
0.1   46972   VSMO   4794213402   42862.0   46972,VSMO,num=4794213402,size=2696,HMS=42862.0,dt=4110.0,n=0,m=4111,clock=8.4770000000026
0.1   46972   VSMO   4794213403   42862.0   46972,VSMO,num=4794213403,size=2697,HMS=42862.0,dt=4110.0,n=0,m=4111,clock=8.4770000000026
0.1   46972   VSMO   4794213404   42862.0   46972,VSMO,num=4794213404,size=2698,HMS=42862.0,dt=4110.0,n=0,m=4111,clock=8.4770000000026
0.1   46972   VSMO   4794213405   42862.0   46972,VSMO,num=4794213405,size=2699,HMS=42862.0,dt=4110.0,n=0,m=4111,clock=8.4770000000026
0.1   46972   VSMO   4794213406   42862.0   46972,VSMO,num=4794213406,size=2700,HMS=42862.0,dt=4110.0,n=0,m=4111,clock=8.4770000000026
0.1   46972   VSMO   4794213881   42889.0   46972,VSMO,num=4794213881,size=2702,HMS=42889.0,dt=4083.0,n=0,m=4084,clock=8.4770000000026
0.1   46972   VSMO   4794214435   42919.0   46972,VSMO,num=4794214435,size=2704,HMS=42919.0,dt=4053.0,n=0,m=4054,clock=8.482
0.0   46972   VSMO   4794214436   42919.0   46972,VSMO,num=4794214436,size=2705,HMS=42919.0,dt=4053.0,n=0,m=4054,clock=8.482
0.1   46972   VSMO   4794214729   42935.0   46972,VSMO,num=4794214729,size=2707,HMS=42935.0,dt=4037.0,n=0,m=4038,clock=8.482
0.1   46972   VSMO   4794214730   42935.0   46972,VSMO,num=4794214730,size=2708,HMS=42935.0,dt=4037.0,n=0,m=4038,clock=8.482
0.1   46972   VSMO   4794214732   42936.0   46972,VSMO,num=4794214732,size=2710,HMS=42936.0,dt=4036.0,n=0,m=4037,clock=8.482
0.1   46972   VSMO   4794214733   42936.0   46972,VSMO,num=4794214733,size=2711,HMS=42936.0,dt=4036.0,n=0,m=4037,clock=8.482
0.1   46972   VSMO   4794214734   42936.0   46972,VSMO,num=4794214734,size=2712,HMS=42936.0,dt=4036.0,n=0,m=4037,clock=8.482
0.1   46972   VSMO   4794214735   42936.0   46972,VSMO,num=4794214735,size=2713,HMS=42936.0,dt=4036.0,n=0,m=4037,clock=8.482
0.0   46972   VSMO   4794214736   42936.0   46972,VSMO,num=4794214736,size=2714,HMS=42936.0,dt=4036.0,n=0,m=4037,clock=8.482
0.1   46972   VSMO   4794214737   42936.0   46972,VSMO,num=4794214737,size=2715,HMS=42936.0,dt=4036.0,n=0,m=4037,clock=8.482
0.1   46972   VSMO   4794214738   42936.0   46972,VSMO,num=4794214738,size=2716,HMS=42936.0,dt=4036.0,n=0,m=4037,clock=8.482
первое число в стоке - задержка передачи параметров из QUIK в приложение в мкс.
--------------------
Резюме:  задержка передачи методом file mapping параметров из QUIK в другое приложение составляет 0.0000001 сек.

 
То есть что-то вроде Shared Memory.
Надо будет разобраться.

Все дело в строчках
Код
package.cpath =paths.."?.dll;"require"nkthread"
как понимаю.
Что за nkthread ? Это для Lua? Он-то и мутит Shared memory, отсюда такая скорость, тут очевидно.

Что за "тест" в SciTE? В смысле мини-скрипт на Lua?

Что за мутный SciTE? Это именно редактор или IDE внутри которой что-то еще запущено?

Чем плох Notepad++, обычный Notepad или простой и понятный Emacs ?
 
Цитата
A.T. написал:
Ну я же написал  file mapping.
 
подробно с примерами можно почитать в книге Дж.Рихтер "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows"
 
Цитата
A.T. написал:
То есть что-то вроде Shared Memory.
Надо будет разобраться.

Все дело в строчках
Код
  package.cpath  = paths .. "?.dll;"require"nkthread"  
как понимаю.
Что за nkthread ? Это для Lua? Он-то и мутит Shared memory, отсюда такая скорость, тут очевидно.

Что за "тест" в SciTE? В смысле мини-скрипт на Lua?

Что за мутный SciTE? Это именно редактор или IDE внутри которой что-то еще запущено?

Чем плох Notepad++, обычный Notepad или простой и понятный Emacs ?
nkthread - это моя библиотека дополнительных функций ( типа QLUA)
В ней много чего есть в том числе и многопоточность для луа и передача данных в другие приложения и вызов в луа функций СИ из сторонних dll .
 
Цитата
nikolz написал:
подробно с примерами можно почитать в книге Дж.Рихтер "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows"
Знаю эту книгу. Про разницу file mapping file mapping vs. shared memory и гугл в принципе отвечает. Разницы почти никакой с точки зрения результата. По сути это одна и та же вещь.

А вот код в "тесте" (за за слово "тест", кстати - имеется в виду скрипт на коленке для быстрой поверки?)
код в тесте совсем непонятен.

package.cpath =paths.."?.dll;" require"nkthread"

Что за dll, откуда их брать?

ss=nkmx.gsm(0,T)   -- это что?

И про SciTE все таки не понял.
 
в Scite  написан скрипт на луа, в которой  читаются данные из QUIK
т е тест передачи данных из приложения QUIK в приложение LUA53 в котором исполняется этот скрипт.
Тест выводит эти данные в окно реадактора SCiTe.
 
nikolz, Вы можете объяснить следущее.
Я скачал книгу Programming in Lua, разбираюсь.
Как понимаю, она подойдет и для QLua.

Грубо говоря, Lua это такой встраеваемый скриптовой язык вообще. То есть любой разработчик, кому надо прикурутить к своей среде (хоть к игре, хоть самописный Excel какой, хоть тот же терминал Quik) может встроить Lua, чтобы пользователи писали скрипты, выполняемые в этой среде.
На C пользователи  писать не могут, потому что потребуется компилятор и какое-то межпроцессное взаимодействие и вот это всё.
Поэтому взяли Lua. Могли бы взять Python или javaScript с тем же результатом, не важно.

Но Lua в данном смысле, выполняется совместно в оновным экзешником программы. В квиком в данном случае.


Мне надо написать свою простую С++ программу, которая бы брала каким-то образом данные из Lua-квика и перегоняла их (попутно преобразовывая) в Insert/Select запросы в базу данных на SQL Server. (ODBC, не важно, это уже моя задача).

Я технически не понимаю, как будет работать этот "мост" Qlua -- и моя программа на С.

Я мыслю  в категориях "клиент-сервер".
То есть что должно быть в итоге.

Пользователь вручную(!) запускает в квике некий Луа-скрипт, который каким-то образом (каким?) открывает шлюз, (открывает хедл, слушает порт, открывает общую память, не знаю..., что-то в этом роде)

Я моя программа к нему подцепляется и спрашивает данные, вызвает функции.
То есть это программа-клиент


Как этот мост в этом скрипте Lua выглядит? Какие функции в том скрипте прописать, что в скрипте делается технически для клиент-серверного взаимодействия?

И я в принципе не правильно представляю.
Какую главу в той книге тогда читать? Очень скудные в книге примеры.
 
...Или я в принципе не правильно представляю...
 
Цитата
A.T. написал:
nikolz , Вы можете объяснить следущее.
Я скачал книгу Programming in Lua, разбираюсь.
Как понимаю, она подойдет и для QLua.

Грубо говоря, Lua это такой встраеваемый скриптовой язык вообще. То есть любой разработчик, кому надо прикурутить к своей среде (хоть к игре, хоть самописный Excel какой, хоть тот же терминал Quik) может встроить Lua, чтобы пользователи писали скрипты, выполняемые в этой среде.
На C пользователи  писать не могут, потому что потребуется компилятор и какое-то межпроцессное взаимодействие и вот это всё.
Поэтому взяли Lua. Могли бы взять Python или javaScript с тем же результатом, не важно.

Но Lua в данном смысле, выполняется совместно в оновным экзешником программы. В квиком в данном случае.


Мне надо написать свою простую С++ программу, которая бы брала каким-то образом данные из Lua-квика и перегоняла их (попутно преобразовывая) в Insert/Select запросы в базу данных на SQL Server. (ODBC, не важно, это уже моя задача).

Я технически не понимаю, как будет работать этот "мост" Qlua -- и моя программа на С.

Я мыслю  в категориях "клиент-сервер".
То есть что должно быть в итоге.

Пользователь вручную(!) запускает в квике некий Луа-скрипт, который каким-то образом (каким?) открывает шлюз, (открывает хедл, слушает порт, открывает общую память, не знаю..., что-то в этом роде)

Я моя программа к нему подцепляется и спрашивает данные, вызвает функции.
То есть это программа-клиент


Как этот мост в этом скрипте Lua выглядит? Какие функции в том скрипте прописать, что в скрипте делается технически для клиент-серверного взаимодействия?

И я в принципе не правильно представляю.
Какую главу в той книге тогда читать? Очень скудные в книге примеры.
QLua - это библиотека функций для взаимодействия с терминалом и сервером брокера на Lua.
-----------------
т е язык Lua. Книга подойдет.
===========================  
Вы можете написать сервер на луа, а клиента на СИ .
======================
В любую программу на СИ можно встроить VMLua - виртуальную машину луа. Это программная модель вычислителя со стековой структурой регистров.
Тест программы на луа  при его загрузки в VMLua компилируется в байт-код - это язык VMLua. Байт-код разбирается далее на поле команды(операции) и поля операндов
Каждая команда(операция) исполняется функцией, которая написана на СИ.
Есть API C for Lua, который позволяет писать свои функции на СИ для VMLua и таким образом расширять возможности с быстродействием СИ.
QLUA - это и есть такая библиотека на СИ.
========================
Сервер на Lua выглядит очень просто.
Для этого используют  https://lunarmodules.github.io/luasocket/
----------------------------
LuaSocket - это библиотека расширений Lua, состоящая из двух частей: ядра C, обеспечивающего поддержку транспортных уровней TCP и UDP,
и набора модулей Lua, добавляющих поддержку функциональности, обычно необходимой приложениям, работающим с Интернетом.



 
 
и еще..
Вы можете использовать в  категориях "клиент-сервер"
[*]Каналы передачи данных Pipe
[*]Каналы передачи данных Mailslot
Страницы: 1
Читают тему
Наверх