Перейти к публикации
Форум - ComputerCraft
  • 0
BrightYC

Как запустить фоновый процесс?

Вопрос

Всем привет.Мне нужна ваша помощь.

Я хочу сделать,чтобы если кто-то подходил к датчику движения-и подавался редстоун сигнал.

Но вот проблема,сенсор нельзя впихнуть в микроконтроллер,да и не подключается он к внешним компонентам.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0

Вариант для RC

common = {}
common.event = require("event")
common.cmp = require("component")
common.side = require("sides").top
common.red = common.cmp.redstone
common.r_on = 15
common.r_off = 0
 
function common.reset_red()
  for i = 0, 5 do --хотя вообще-то так делать не стоит
    common.red.setOutput(i, common.r_off)
  end
end
 
function common.red_on()
  common.red.setOutput(common.side, common.r_on)
end

function common.red_off()
  common.red.setOutput(common.side, common.r_off)
end
 
function start(args)
  local valid_users = {["man_cubus"] = true}
  local sensitivity = 64
  local r_timeout = 1
  local sensor = common.cmp.motion_sensor
  sensor.setSensitivity(sensitivity)
 
  local function valid(name)
    return valid_users[name]
  end
 
  function common.motion_handler(...)
    local evt = {...}
    local function off()
      common.red_off()
    end
    if valid(evt[6]) then
      common.red_on()
      common.event.timer(r_timeout, off, 1)
    end
  end
 
  common.reset_red()
  common.event.listen("motion", common.motion_handler)
end
 
function stop()
  common.event.ignore("motion", common.motion_handler)
  common.red_off()
end

Код сохранить в /etc/rc.d/sense.lua и выполнить

rc sense enable
rc sense start

Сигнал отправляется через верхнюю сторону блока, но ты сможешь это изменить (строка common.side = require("sides").top)

Я дополнительно добавил возможность указать пользователей, которых детектор будет замечать чрез функцию valid. Если нужно чтобы сенсор срабатывал для всех, то просто возвращай из этой функции true

Изменено пользователем man_cubus
  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Ответ по существу уже прозвучал, но меня смущает формулировка вопроса:

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

Если для выполнения задачи "целый компьютер" избыточен, а возможностей микроконтроллера недостаточно, то сгодится упрощенный компьютер, состоящий из корпуса, процессора, памяти, да EEPROM с программой.

 

К тому же фоновые задачи могут иметь труднопрогнозируемый лаг, что сужает возможности их применения в процессах, требующих быстрой реакции. В этом случае заточенные под одну небольшую задачу микроконтроллеры и упрощенные компьютеры могут оказаться лучшим выбором.

  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Даже написал.Спасибо,проверю

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Ответ по существу уже прозвучал, но меня смущает формулировка вопроса:

Если для выполнения задачи "целый компьютер" избыточен, а возможностей микроконтроллера недостаточно, то сгодится упрощенный компьютер, состоящий из корпуса, процессора, памяти, да EEPROM с программой.

 

К тому же фоновые задачи могут иметь труднопрогнозируемый лаг, что сужает возможности их применения в процессах, требующих быстрой реакции. В этом случае заточенные под одну небольшую задачу микроконтроллеры и упрощенные компьютеры могут оказаться лучшим выбором.

Думаю,так проще.Но всё же,мне было интересно,возможно ли это.Хотя когда-то спокойно ставил на компы 3 уровня кодовый замок.Всем спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Вот вариант для rc.

Честно признаюсь что не тестировал и не отлаживал. Если возникнут проблемы - пиши.

Хм,при rc sense start https://imgur.com/a/q7gbQct 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Хм,при rc sense start https://imgur.com/a/q7gbQct 

Битая ссылка

 

Отладить смогу через полтора часа. А пока попробуй сам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

К тому же фоновые задачи могут иметь труднопрогнозируемый лаг, что сужает возможности их применения в процессах, требующих быстрой реакции. В этом случае заточенные под одну небольшую задачу микроконтроллеры и упрощенные компьютеры могут оказаться лучшим выбором.

Возможно.

Но есть пара возражений по существу и одно субъективное:

  1. Открытие двери не требует вот прямо моментальной реакции как правило. И для event.listen лаг сведен к достаточно малой величине чтобы не задумываться о нём.
  2. Упрощённые компьютеры - это замечательно, но если дверей/люков десяток, а игроков, которые ходят через них туда-сюда не так много (зачастую один владелец привата) , то один выделенный компьютер может быть более выгодным и легче расширяемым вариантом. Например если понадобится добавить еще и умное освещение на таких же сенсорах.
  3. RC рулит :) . А если серьёзно, то rc кроме всего прочего позволяет в rc.conf хранить конфиг к модулю и не переписывать код при добавлении новых сенсоров и редстоун-контроллеров.

P.S.

Решил допилить до варианта с многими сенсорами и многими редстоун-контроллерами

Изменено пользователем man_cubus

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

К слову, моционный сенсор должен вставляться в микроконтроллеры, если вы не застряли где-то в начале прошлого года.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Обновил код, теперь там отлаженная версия.

Тут Fingercomp говорил о "свинской" уязвимости и я думаю, нелишне упомянуть тут об этом: если биркой назвать существо (например свинью) именем того пользователя, который есть в списке valid_users, то сенсор на это существо сработает.

Так что не для критично важных вещей типа управления реактором, такую штуку использовать крайне осторожно.

Изменено пользователем man_cubus

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

есть пара возражений

А с чем тут можно спорить? С тем, что чувствительные к лагу процессы не должны отдавать распределиние приоритетов операционной системе? У каждой задачи своя специфика, и каждый из подходов может оказаться оптимальным в соответствующих условиях. Низкоприоритетные процессы с низкой нагрузкой прекрасно уживаются друг с другом и работают в фоне. Удобнее всего это сделать через механизмы, предоставляемые операционной системой. Процессы, требующие быстрой реакции, должны работать на выделенных компьютерах, желательно вообще без операционнной системы для снижения влияния её процессов.

 

Открытие двери не требует вот прямо моментальной реакции как правило

Есть и контрпримеры. Основным процессом может быть запущена zip-архивация, в результате работы которой двери будут открываться фоновым процессом с лагом в несколько секунд. А динамические схемы ядерных реакторов вообще требуют контролируемой задержки. Нужна уверенность в том, что при вызове computer.pullSignall() задержка будет иметь погрешность в пределах одного тика. Работа такой программы в фоне может привести к взрыву реактора.

 

Упрощённые компьютеры - это замечательно, но если дверей/люков десяток, а игроков, которые ходят через них туда-сюда не так много (зачастую один владелец привата) , то один выделенный компьютер может быть более выгодным и легче расширяемым вариантом.

Если компьютер выделенный, то и задача перестает быть для него фоновой. Такая программа сама распределяет приоритеты подзадач. К примеру, при управлении несколькими ядерными реакторами программа имеет возможность не только прогнозировать критические моменты каждого реактора, но и отсрочить их, безопасно распределяя управление периферией во времени. А когда критические моменты далеко, в это время можно дать команды на крафт и распределение свежих порций топлива, получить указания с центрального пульта или освежить инфу для него.

То есть, контролировать множество устройств с одного компьютера является хорошей идеей. Но в ряде случаев плохой идей будет отдать распределение приоритетов между процессами операционной системе.

 

rc кроме всего прочего позволяет в rc.conf хранить конфиг к модулю и не переписывать код при добавлении новых сенсоров и редстоун-контроллеров

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

 

 

Итог всё тот же: решение может считаться плохим или хорошим лишь применительно к конкретной задаче.

 

Ну, а применительно к нашему форуму задачей вообще может оказаться получение опыта работы с RC. Тут выбор очевиден, против этого не возразить. И уж точно, не смотря на существование альтернатив, твой код заслуживает внимания. Это не оспаривается. Хорошая работа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Да,всё работает.Спасибо,очень помогаете с изучением.В любом случае,спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×