OpenComputers/Event API

Материал из Minecraft Wiki
Перейти к: навигация, поиск

Базовая система событий. Представляет собой надстройку над стандартными сигналами, с более удобным интерфейсом.

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


Интерфейс[править | править код]

  • event.listen(name: string, callback: function): boolean

Регистрирует нового "слушателя" (listener) событий, который вызывается для событий с заданным названием (если это "слушатель" сигналов, то должно быть задано имя сигнала). Возвращает true, если "слушатель" был успешно зарегистрирован и false, если "слушатель" для событий этого типа уже назначен.

Обратите внимание, что "слушатели" могут возвращать значение false для удаления своей регистрации (эквивалентно вызову event.ignore с названием этого "слушателя" и именем события, для которого он был зарегистрирован).


  • event.ignore(name: string, callback: function): boolean

Удаляет регистрацию "слушателя" (listener). Возвращает true, если регистрация была успешно удалена и false, если такого "слушателя" зарегистрировано не было.


  • event.timer(interval: number, callback: function[, times: number]): number

Запускает новый таймер, который будет вызван через время, определенное в interval. По умолчанию таймер срабатывает один раз. Число срабатываний определяет параметр times. Значение math.huge заставит таймер повторяться бесконечно.

Функция возвращает номер-идентификатор, который может быть использован в функции timer.cancel для того, чтобы отменить таймер (даже если он еще ни разу не сработал).

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

Важно: таймеры используют функцию event.pull. Если вы перехватываете сигналы функцией os.pullSignal, и не используете event.pull — таймеры работать не будут!


  • event.cancel(timerId: function): boolean

Отменяет таймер созданный командой event.timer. Возвращает true, если таймер успешно отменен и false, если таймера с таким ID не существует.


  • event.pull([timeout: number], [name: string], ...): string, ...

Эта команда, кроме os.sleep(), должна быть основным способом "ожидания" программы. Функция используется для обработки событий (в том числе и сигналов, которые не были перехвачены другой функцией раньше). Также функция принимает вызовы таймеров созданных функцией event.timer. Таким образом, функция должна вызываться периодически.

Первый параметр — это число, определяющее сколько функция ждет события, прежде чем отправить nil. В это случае второй параметр — это имя события. Если время ожидания не определено, то имя события становится первым параметром. Имя события может быть nil, тогда фильтрация событий выполняться не будет. Остальные параметры используются как прямой фильтр. Функция будет возвращать только те события, которые подойдут под условие (точное совпадение параметров, для названия события можно использовать регулярные выражения, см. string.match).

Для примера, сигнал touch (когда игрок щелкает мышью по монитору второго поколения) имеет сигнатуру screenX: number, screenY: number, playerName: string. Чтобы отсортировать щелчки только от игрока "Стив", вы должны использовать следующую конструкцию: local _, x, y = event.pull("touch", _, _, "Стив")


  • event.shouldInterrupt(): boolean

Эта функция вызывается event.pull, после каждого принятого сигнала, чтобы определить должен ли тот быть прерван преждевременно. Если она возвращает true, event.pull создаст interrupted ошибку. По умолчанию, она возвращает true, если была нажата комбинация Ctrl + Alt + C.


  • event.onError(message: any)

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


Пример[править | править код]

Эта программа проверяет, работает ли компьютер больше 300 секунд, каждые 30 секунд. Если да, то перезагружает компьютер.

local computer = require("computer")
local event = require("event")

function onTimer()
    computer.shutdown(true)
end

-- Выполнить 50 раз, затем остановится. Если вы не успели что-то
-- доделать за эти 300 секунд - то у вас большие проблемы
event.timer(30, onTimer, 50)