Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  1 2 >  
Ответить в эту темуОткрыть новую тему
> Обмен данными
sutra
сообщение 24.3.2021, 16:52
Сообщение #1


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Всем привет! Может всё-таки есть какой-то способ получить данные от работы параллельного скрипта в lua. Ну хотя бы байт, в качестве флага. Раньше использовал клипбоард, но переключаться на язык Пилота не хочется, да и не совсем это хорошо. Работа через файл не устраивает - медленно.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 24.3.2021, 18:11
Сообщение #2


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Цитата(DarkMaster @ 24.3.2021, 18:01) *

luasocket и вперед =)

А поподробнее, для чайника.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 24.3.2021, 18:42
Сообщение #3


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27681
Пользователь №: 11.279



luasocket - это модуль для работы с сетью. Соответственно открываете порт для прослушивания на одном скрипте, другим цепляетесь, перекидываете любые данные туда-сюда. Можно даже перекидывать голый код для удаленного выполнения.

https://forum.uokit.com/index.php?act=Attac...ost&id=3343


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 25.3.2021, 13:21
Сообщение #4


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Спасибо Дарк. Надо разбираться, слишком много там наворочено.
Всё бы ничего, но обработка таймингов просто отвратительная и сильно усложняет анализ.
Почему так происходит я не знаю. По факту максимальная точность на которую я могу опираться - это 0.010 - 0.016 секунды. Чтобы не быть голословным вот простейший скрипт.

--lua
local count,t1,t2=0,os.clock()
while true do
count=count+1
t2=os.clock()
if t2~=t1 then break end
end
log(count,t2-t1)

И если вы зададите ожидание в 1 тысячную, то на выходе получите минимум 1 сотую.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 25.3.2021, 14:07
Сообщение #5


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27681
Пользователь №: 11.279



Цитата
И если вы зададите ожидание в 1 тысячную, то на выходе получите минимум 1 сотую.

Я знаю эту хрень. Когда-то гуглил - вроде есть обходы. Вроде находил на чем-то связанном с бенчмарками, но это было уж очень давно.

По передачи данных через сокеты прям мгновенную скорость не факт, что получится развить ибо все проходит через буферы и получить лишнюю сотку можно очень легко. Тем не менее могу предложить идею создавать некоторый массив через ffi, адрес этого массива передать в другой скрипт любым самым тормозным способом, но уже зная адрес этого массива мы можем читать данные напрямую все через тот же ffi.cast.

При этом нужно понимать, что писать туда ничего не нужно из нескольких скриптов одновременно, либо создавать синхронизацию потоков.

Сообщение отредактировал DarkMaster - 25.3.2021, 14:08


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 25.3.2021, 15:56
Сообщение #6


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Дарк, спасибо огромное, но мне самому с моим уровнем недотункать. Будет как-нибудь времечко - кинь элементарный пример. Мне и нужно то всего 3 цифры читать. Научился я распознавать звуки, всё вроде нормуль, но когда прилетают звуки один за другим и "наслаиваются", тут без обработки таймингов ну никак не получается. А погрешности таймингов ну просто "дикие". 27 тысячных (у меня) кушает getimage, 16 тысячных погрешность - это всё терпимо. Но если я всё это помещаю в основной скрипт (+27 тысячных на ещё один getimage) весь этот карточный домик разваливается, так как реал-тайм улетучивается. Получается погрешность 7 сотых - это 14 кадров в секунду и вот этого уже явно недостаточно. Ну а не будет времени - плюнь - обойдусь без излишеств и так уж всё больно круто у меня получилось.

Кстати, ты не доделал свой файндимидж?? Хотя я своим, опять же спасибо тебе, ну просто доволен. Ищет абсолютно всё, что мне надо, всё супер быстро, всё равно якорь - это getimage, и этот якорь может поднять только Билли, ну или Илон Маск (IMG:style_emoticons/default/biggrin.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 25.3.2021, 16:14
Сообщение #7


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27681
Пользователь №: 11.279



Цитата
Кстати, ты не доделал свой файндимидж??

Ты не поверишь) Сижу уже неделю тестирую, как и что шустрее. Начал с финдколора ибо он вообще мертвый. Там получился целый набор функций. Для меня например оказалось большим сюрпризом, что передача массивов в функции и последующая работа с ними намного тормознутее работы с кучей переменных. Причем там проигрыши были до 5000 раз.

По поводу передачи параметров.
В первом скрипте:
Код

    local data = ffi.new("unsigned int[3]")
    data[1] = 123
    data[2] = 321
    data[3] = 456
-- далее куда-нибудь в файл/сокет, да хоть ручками вбить значение во второй скрипт:
    log(tostring(data))

Соответственно во втором скрипте:
Код

    -- Написано по-свински. Как нормально создать указатель
    -- на некоторый адрес я так и не понял.
    -- Создает вроде как на NULL,
    -- но меня прям разрывает от негодования,
    -- что я не могу инициализировать значение, хотя бы нулем.
    -- Так что есть теоретические шансы, что куда-то улетит
    -- указатель при объявлении.
    -- Все мои попытки нормально задать адрес разбились об
    -- изменение типа с указателя на number/int в автоматическом режиме.
    local p = ffi.new("unsigned int*")
    local i = ffi.new("unsigned int[1]",address)

    p = p+i[0]/4 + 1 -- Устанавливаем указатель на наш адрес.
    log(p[0],p[1],p[2]) -- cобственно наши данные


Сообщение отредактировал DarkMaster - 25.3.2021, 17:21


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 25.3.2021, 17:03
Сообщение #8


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Что-то у меня не получилось, выдаёт три нуля. Адрес присваивал шестнадцатиричное число из первого скрипта.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 25.3.2021, 17:15
Сообщение #9


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



cdata<unsigned int [3]>: 0x03be1da8

Это лог 1-го скрипта

Код

--lua
local ffi=require "ffi"
address=0x03be1da8
local p = ffi.new("unsigned int*")
local i = ffi.new("unsigned int[1]",address)

p = p+i[0] -- Устанавливаем указатель на наш адрес.
log(p[0],p[1],p[2]) -- cобственно наши данные

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 25.3.2021, 17:23
Сообщение #10


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27681
Пользователь №: 11.279



Поправил код. Там фишка в том, что при математике указателя:
p = p + 1
он делает фактически не +1, а +резмер типа данных.
Т.е. он по сути делает p=&p[1]. Как-то так. Да простят меня сишники, если я тут ужас по синтаксису написал.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 25.3.2021, 18:01
Сообщение #11


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Одно слово - мастер. Удачи! А я все свои картинки (силуэты) загнал в один бинарный файл. И сразу всё грузится по нужным СИ-шным массивам, ну очень ... очень быстро и потом кручу верчу тысячи этих картинок. Но повторюсь, делал для себя.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 28.3.2021, 19:28
Сообщение #12


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26703
Пользователь №: 16.971
Возраст: 29



Цитата
local p = ffi.new("unsigned int*")
local i = ffi.new("unsigned int[1]",address)
p = p+i[0]/4 + 1 -- Устанавливаем указатель на наш адрес.
log(p[0],p[1],p[2]) -- собственно наши данные

Так не проще?:
Код
local address = 0x00a61f88
local p = ffi.new('unsigned int*', ffi.cast('unsigned  int*', address))
p=p+1
log(p[0],p[1],p[2]) -- собственно наши данные
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 28.3.2021, 19:46
Сообщение #13


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Спасибо большое. У меня кстати тоже возникала такая мысль. Но надеюсь, что в будущем всё это наверное не понадобится. Даже если при твоей нынешней реализации getimage, без всяких доработок, искать индикатор звука - это будет практически мгновенно. Но на перспективу надо всё равно взять на заметку - спасибо.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 28.3.2021, 20:28
Сообщение #14


**********

Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008
Группа: Супермодераторы
Наличность: 22570
Из: Северная Корея
Пользователь №: 11.273



Цитата(DarkMaster @ 25.3.2021, 16:14) *

Ты не поверишь) Сижу уже неделю тестирую, как и что шустрее. Начал с финдколора ибо он вообще мертвый. Там получился целый набор функций. Для меня например оказалось большим сюрпризом, что передача массивов в функции и последующая работа с ними намного тормознутее работы с кучей переменных. Причем там проигрыши были до 5000 раз.


Да, получалось, что ты делал побитовое копирование всех элементов массива, вместо передачи ссылки на этот массив, что намного дороже по времени.


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 28.3.2021, 21:05
Сообщение #15


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27681
Пользователь №: 11.279



Цитата
Да, получалось, что ты делал побитовое копирование всех элементов массива, вместо передачи ссылки на этот массив, что намного дороже по времени.

Это где я весь массив копировал? Та шапка - это по сути установка базового адреса, дальше по указателям. По крайней мере осознанно я указатели дергал. Самые большие провалы по скорости были в случаях когда в функцию передается стандартный lua массив и с этим массивом потом начинается математика, при том, что в луа массивы передаются по ссылке/указателю, а не копируются. Меняешь массив на набор переменных и все ок. Причина такого фатального провала по скорости мне не ясна. Есть подозрение, что это связано со скрытыми проверками на выход за пределы массив либо чем-то схожим, но это не более, чем догадка.
Цитата
Так не проще?

Проще. Но тогда мне мозги эта хрень вынесла полностью.
p = a будет number
p = p + a будет number
p = p + 1 будет указатель
p = 1 будет number
p = p - p +1 будет number
для меня логика постигнута не была.
Если p + 1 указатель, то почему p+a уже number? Привел тип? А почему в p + 1 не привел? Типа 1 у нас не тип number, не unsigned int, это просто константа, которая была приведена к уже существующему типу? Тогда почему в p = 1 она не была так же приведена к уже существующему указателю? Может я просто не шарю, но для меня это полностью не логичный бред. Поэтому и с плюсами в свое время не сложилось. Ну не понять мне зачем 10 раз переобъявлять стандартные типые данных. Я не против строгой типизации, но когда я вижу какой-нибудь LPSTR у меня глаз начинает дергаться. И только попробуй ему подсунуть какой-то зашкварный указатель, ему нужно только LPSTR, а то, что он будет точно таким же указателем - так это пофигу. Хотелось убивать.

Сообщение отредактировал DarkMaster - 28.3.2021, 21:20


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 28.3.2021, 22:01
Сообщение #16


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26703
Пользователь №: 16.971
Возраст: 29



Цитата
p = p + a будет number

Указатель будет.
Код
--lua
local ffi = require("ffi")
log 'clear' log 'mode compact'

local address = 0x08351f88
local p = ffi.new('unsigned int*', ffi.cast('unsigned  int*', address))
local a = 1
p=p+a
log(tostring(p))




Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 29.3.2021, 13:20
Сообщение #17


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Код

--lua
local ffi=require "ffi"
log "clear" log "mode compact"
data = ffi.new("unsigned int[2]")
    data[1] = 123
    data[2] = 221
local s=tostring(data)         -- вот ведь извращение какое
local adrr=copy(s,26,10)    -- терпеть не может извращений
log(adrr)                           -- что и видно сразу
adrr=""
for i=26,35 do  adrr=adrr..chr(s:byte(i))  end  -- только изврат может побороть изврат
log(adrr)
clipboard(adrr)
while true do  end



Скорее осознание того, что всё-таки надо допинать эту фичу, чем необходимость, заставила меня как обычно заниматься не алгоритмом, а борьбой с извращениями. Специально выложил код для примера.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 29.3.2021, 13:34
Сообщение #18


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Кстати, жаль не записывал все косяки, которые находил.
Ну вот на память например filegetdate - ну очень интересная вещь.
Время почему то не совсем то, которое показывает ну скажем тот же FAR.
У меня был случай, файл был записан 1 марта в 00 часов. Когда получал при помощи этой функции - получил только дату без времени. Слава богу dir такой же кривой. Поэтому рассинхрона не было.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 29.3.2021, 13:39
Сообщение #19


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26703
Пользователь №: 16.971
Возраст: 29



Код
--lua
local ffi=require "ffi"
log "clear" log "mode compact"
local data = ffi.new("unsigned int[2]", {123, 221})
local adrr = tostring(data):match('0x.+')
log(adrr)
clipboard(adrr)

Цитата
Время почему то не совсем то, которое показывает ну скажем тот же FAR.

Используйте winapi, а не функции пилота.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 29.3.2021, 13:41
Сообщение #20


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Про write уже жаловались люди. Уверяю, там хватает косяков, не только по резервированным переменным, ну например при использовании в имени символов ")".

Так понятно, что всё обойти можно. Кабы я всё знал и умел, так зачем мне тогда Пилот? Можно и с нуля нарисовать любую прогу.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

2 страниц V  1 2 >
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 20.4.2024, 15:23
Designed by Nickostyle