Event

Event

В работе программы несколько потоков могут взаимодействовать друг с другом, сигнализируя о событиях и обрабатывая их. Таким образом, событие является своего рода сообщением от одного потока к другому.

Пример 1:

В MP3-плеере один поток сканирует набор клавиш, в то время как основной поток воспроизводит песню. Когда клавиша нажата, событие отправляется в основной поток, например, для остановки воспроизведения.

Пример 2:

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

Для использования этого модуля вам следует сделать следующее:

  1. Создайте событие с помощью функции event.create. Функция create возвращает экземпляр события. Этот экземпляр необходимо сохранить в переменной для дальнейшей работы с ним.
keyPressed = event.create()
  1. Используйте экземпляр события и вызовите функцию wait, когда потоку требуется ожидать события. Когда событие обработано, вызовите функцию done.

    while true do
       keyPressed:wait()
       print("a key is pressed")
       keyPressed:done()
    end
  2. Используйте экземпляр события и вызовите функцию broadcast, когда вам нужно уведомить ожидающие потоки о том, что событие произошло.

    keyPressed:broadcast()

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

Функции

instance = event.create()

Создает новый экземпляр события.

Аргументы: нет.

Возвращает: экземпляр события или исключение. Этот экземпляр необходимо сохранить в переменной для дальнейшей работы с ним.

instance:disable()

Отключает экземпляр события, разблокируя все потоки, ожидающие этого события. Когда событие отключено, все вызовы instance:broadcast или instance:wait игнорируются.

Аргументы: нет.

Возвращает: ничего или исключение.

instance:enable()

Включает отключенный экземпляр события.

Аргументы: нет.

Возвращает: ничего или исключение.

instance:broadcast([wait for completion])

Транслирует экземпляр события всем ожидающим потокам.

Аргументы:

  • wait for completion (необязательно): логический аргумент, указывающий, должен ли вызывающий поток ждать, пока событие будет обработано всеми ожидающими потоками. Если true, вызывающий поток блокируется до тех пор, пока все потоки не обработают событие. По умолчанию значение этого аргумента false (не ждать).

Возвращает: true, если событие было транслировано, false, если событие отключено, или исключение.

instance:wait()

Ожидает события, блокируя вызывающий поток до трансляции события.

Аргументы: нет.

Возвращает: true, если событие было транслировано, false, если событие было отключено во время ожидания, или исключение.

instance:done()

Указывает, что поток обработал событие.

Аргументы: нет.

Возвращает: ничего.

Пример

В следующем примере набор датчиков подключается в основном потоке, и после подключения значения датчиков отслеживаются во вторичном потоке.

-- Create an event
sensorsAttached = event.create()

thread.start(function()
   sensorsAttached:wait()
   sensorsAttached:done()

   while true do
        print("Monitor")

       distance_r = right:read("distance")
       distance_l = right:read("distance")
   
      tmr.delay(1)
   end
end)

-- Instantiate sensors
right = sensor.attach("2Y0A21", adc.ADC1, 0)
left  = sensor.attach("2Y0A21", adc.ADC1, 0)

-- Broadcast event
sensorsAttached:broadcast()