Flays 0 Опубликовано: 25 января, 2021 Драсте, решил тут написать две программки. И мне нужно чтоб один пк отправлял другому пк таблицу, но как это сделать я так и не разобрался. Подскажите кто ни будь пожалуйста. Заранее спасибо) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 542 Опубликовано: 25 января, 2021 32 минуты назад, Flays сказал: Драсте, решил тут написать две программки. И мне нужно чтоб один пк отправлял другому пк таблицу, но как это сделать я так и не разобрался. Подскажите кто ни будь пожалуйста. Заранее спасибо) Какой мод? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Mihis 14 Опубликовано: 25 января, 2021 (изменено) 1 час назад, Flays сказал: Драсте, решил тут написать две программки. И мне нужно чтоб один пк отправлял другому пк таблицу, но как это сделать я так и не разобрался. Подскажите кто ни будь пожалуйста. Заранее спасибо) Все написанное ниже относится к OpenComputers Модемы не умеют передавать таблицы, но для транспортировки таблицы можно сериализовать (таблица => строка), а при получении десериализовать (строка => таблица). Описание функций модема: https://ocdoc.cil.li/component:modem Описание функций сериализации: https://ocdoc.cil.li/api:serialization Пример передающей части local modem = require("component").modem -- получаем модем local serialize = require("serialization").serialize -- получаем метод, для сериализации данных (таблица => строка) local port = 123 -- порт, по которому будет производиться передача данных local my_table = {} -- какая-то таблица, которую мы будем передавать -- сералиализуем таблицу (приводим из таблицы в строку) local ser_table = serialize(my_table) -- открываем порт modem.open(port) -- сералиализуем таблицу (приводим из таблицы в строку) local message = serialize(my_table) -- отправляем таблицу (использовать только 1 из этих функций) modem.send(RECEIVER_ADDR, port, message) -- от 1 устройства к 1 устройству, где RECEIVER_ADDR - это адрес модема получателя -- или modem.broadcast(port, message) -- от 1 устройства к множеству устройств Пример принимающей части local modem = require("component").modem -- получаем модем local event = require("event") local unserialize = require("serialization").unserialize -- получаем метод, для десериализации данных (строка => таблица) local port = 123 -- порт, по которому будет производиться прием данных -- открываем порт modem.open(port) local _, _, _, port, _, message = event.pull("modem_message") -- ожидаем сообщения от другого устройства local my_table = unserialize(message) -- десериализуем полученные данные (приводим из строки в таблицу) -- Теперь тут мы можем что-нибудь делать с этой таблицей (my_table) Изменено 25 января, 2021 пользователем Mihis Опечатка Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Flays Автор вопроса 0 Опубликовано: 25 января, 2021 @NEO Open Computers Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Flays Автор вопроса 0 Опубликовано: 25 января, 2021 @Mihis Спасибо большое, а можно ли будет как-то обойти ожидание запроса сообщение или нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asior 586 Опубликовано: 25 января, 2021 В каком смысле обойти ожидание? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Flays Автор вопроса 0 Опубликовано: 25 января, 2021 Ну получается пока программа не получит ответ, то дальше ничего не будет работать. Не? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asior 586 Опубликовано: 25 января, 2021 Ну как бы да. Если надо импульсно работало чтоб while true do mess = {event.pull("modem_message", 1)} if mess[1] then --серилизация и обработка таблицы else --делаем другие действия end end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Flays Автор вопроса 0 Опубликовано: 25 января, 2021 @Asior Хмм, не понял как это работает. Но так же ожидает запрос Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asior 586 Опубликовано: 25 января, 2021 Запрос теперь будет ожидать 1 сек, потом выполнять действия которые надо, затем опять ожидать запрос. Попробуй отслеживать все через print(). Хотя честно говоря я так и не понял до конца чего ты хочешь ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Flays Автор вопроса 0 Опубликовано: 25 января, 2021 @Asior Пробовал отслеживать через принт, всё равно не хухры. На вики чекнул что там сначала цифра, а потом что нужно. А я хотел изначально чтоб всегда была проверка на есть ли какой-то сигнал, если нету то выводить на экран что его нету и ждать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 26 января, 2021 12 часа назад, Flays сказал: @Asior Пробовал отслеживать через принт, всё равно не хухры. На вики чекнул что там сначала цифра, а потом что нужно. А я хотел изначально чтоб всегда была проверка на есть ли какой-то сигнал, если нету то выводить на экран что его нету и ждать. 12 часа назад, Flays сказал: а можно ли будет как-то обойти ожидание запроса сообщение или нет? Так что именно требуется? Ждать или не ждать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Mihis 14 Опубликовано: 26 января, 2021 14 часа назад, Flays сказал: @Mihis Спасибо большое, а можно ли будет как-то обойти ожидание запроса сообщение или нет? Можно использовать event.listen, которая регистрирует обработчик события в фоне. Но тогда нужно после завершения программы отменять его (event.cancel), иначе после завершения программы обработчик продолжит свою работу. Описание функций event: https://ocdoc.cil.li/api:event Пример: local event = require("event") -- Функция, которая будет выполнена при получении события local function handleEvent(event_name, _, _, port, _, message) if (event_name) then -- иногда event_name может иметь значение nil, если долго не было события -- десериализируем табличку (message) end end local listener_id = event.listen("modem_message", handleEvent) if (listener_id) == false then -- выполняется, если неудалось зарегистрировать обработчик print("failed to register listener") return -- завершаем программу end -- Что-нибудь делаем print("Hello! How are you") -- Завершаем программу: отменяем обработчик event.cancel(listener_id) 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Flays Автор вопроса 0 Опубликовано: 26 января, 2021 @eu_tomat То и то. Чтоб программа ожидала запрос, но и в этот же момент всё равно работала. А не только ожидала запрос и пока его не будет, сама программа не будет фукционировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Flays Автор вопроса 0 Опубликовано: 26 января, 2021 @Mihis А что означают подчёркивание? event_name, _, _, port, _, message Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Mihis 14 Опубликовано: 26 января, 2021 (изменено) 1 минуту назад, Flays сказал: @Mihis А что означают подчёркивание? event_name, _, _, port, _, message эти аргументы будут проигнорированы (чтобы лишние переменные не объявлять) Если их убрать, то там будут совмем другие данные Изменено 26 января, 2021 пользователем Mihis Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 26 января, 2021 42 минуты назад, Flays сказал: @eu_tomat То и то. Чтоб программа ожидала запрос, но и в этот же момент всё равно работала. А не только ожидала запрос и пока его не будет, сама программа не будет фукционировать. Программа не может ждать и не ждать одновременно. Но, например, может пытаться получить очередную запись из очереди событий с некоторой периодичностью, если указать нулевое время ожидания: event.pull("modem_message", 0). Даже если назначить обработчик событий через event.listen(...), для его функционирования потребуется периодически вызывать os.sleep(). То есть, в этом случае ожидание тоже не постоянное, его размер и периодичность также задаётся программистом. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Mihis 14 Опубликовано: 26 января, 2021 3 минуты назад, eu_tomat сказал: Даже если назначить обработчик событий через event.listen(...), для его функционирования потребуется периодически вызывать os.sleep(). Не знал. Я это запомню. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Flays Автор вопроса 0 Опубликовано: 29 января, 2021 А кто тут жив? А подскажите как можно передать сообщение через миры? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
serafim 272 Опубликовано: 29 января, 2021 (изменено) 45 минут назад, Flays сказал: как можно передать сообщение через миры? используй связанную плату @Flays Если не секрет что за проект делаешь ? Изменено 29 января, 2021 пользователем serafim Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Mihis 14 Опубликовано: 29 января, 2021 (изменено) 4 часа назад, serafim сказал: используй связанную плату @Flays Если не секрет что за проект делаешь ? Похоже, что этот Изменено 29 января, 2021 пользователем Mihis Помог форуму превратить ссылку в превью Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Драсте, решил тут написать две программки. И мне нужно чтоб один пк отправлял другому пк таблицу, но как это сделать я так и не разобрался. Подскажите кто ни будь пожалуйста. Заранее спасибо)
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах