Перейти к содержимому
  • 0
bob558

Вопрос по event

Вопрос

Не могу разобраться с  отслеживанием  событий. 

event.listen('touch', touch)

Ни разу не пользовался этим.

 

Сначала я полагал, что только в какой-то части код будет отслеживать события. По типу что print () печатает только в определенном куске кода. Разбирая программу   OpenClicker    qwertyMAN увидел, что только один раз прописывается  event.listen и потом, пока неведомым мне способом, отслеживается нажатие.

 

Подскажите, как, в какой момент времени  и где производится отслеживание нажатия.

Где в этот момент "фокус" программы?

 

Буду рад вашим не большим примерам.

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


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

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

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

Здесь есть пример

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


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

У  qwertyMAN в Кликере есть такая функция обработки 

local function touch(_,_, x, y) -- проверка нажатия локально
    if x<21 then
        if x>1 and x<6 and y==24 then
            quit = true
        elseif x>6 and x<13 and y==24 then
            reboot()
        elseif x>13 and x<21 and y==24 then
            quit_cash = not quit_cash
            draw_quit_cash()
        else
            for i=1, #worker do
                local size = 5+i*2
                if size-1 == y or size==y then
                    buy(i)
                end
            end
        end
    elseif x>60 and x<80 and y>5 and y<16 then
        cash = cash + click_cash
        draw_cash()
    end
end
 
Вызывается
  
event.listen('touch', touch)

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

Если программа выполняется последовательно, оператор за оператором, когда отслеживается нажатие? Ведь только один раз  < event.listen > был прописан.

 

 

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


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

Функция вызывается при получении ивента touch, ей передаются параметры ивента. Обработка ивентов происходит во время работы функции event.pull (или os.sleep, которая внутри всё равно вызывает event.pull).

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


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

Сама по себе event.listen не проверяет нажатие клавиши. Она регистрирует в системе "слушателя". Слушатель это сопоставление определенному событию некоторой функции.

А работает это примерно так. Любая программа под OpenOS рано или поздно должна вызвать функцию event.pull, в противном случае мы получим синий экран с сообщением о том, что что-то там слишком долго не вызывалось. Мы все такое сообщение не раз видели. Так вот, эта функция event.pull ожидает системного события и, помимо прочих других полезных вещей, проверяет не назначен ли полученному событию слушатель. И если назначен, вызывает сопоставленную ему функцию-обработчик. Конкретно эта проверка выполняется функцией dispatch из модуля event:

 

 

local function dispatch(signal, ...)
  if listeners[signal] then
    local function callbacks()
      local list = {}
      for index, listener in ipairs(listeners[signal]) do
        list[index] = listener
      end
      return list
    end
    for _, callback in ipairs(callbacks()) do
      if call(callback, signal, ...) == false then
        event.ignore(signal, callback) -- alternative method of removing a listener
      end
    end
  end
end 

 

 

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

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

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


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

А что делать, если синий экран появляется даже если делается event.pull() ?

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

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


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

 

 

А что делать, если синий экран появляется даже если делается event.pull() ?

если так, то мне кажется ты редко вызываешь его, чаще всего такая боль происходить в циклах, в теле которых не вызывается event.pull() или другие методы, вызывающие event.pull() (например os.sleep()), сколько кодил на ОС - на подобный вылет натыкался только в циклах и рекурсиях

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


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

если так, то мне кажется ты редко вызываешь его, чаще всего такая боль происходить в циклах, в теле которых не вызывается event.pull() или другие методы, вызывающие event.pull() (например os.sleep()), сколько кодил на ОС - на подобный вылет натыкался только в циклах и рекурсиях

такая боль происходит от того, что вместо ticks используется time

Падает даже встроенная ОС, на которой ничего не делается совсем - просто загрузился комп и ждет ввода команды

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


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

такая боль происходит от того, что вместо ticks используется time

Падает даже встроенная ОС, на которой ничего не делается совсем - просто загрузился комп и ждет ввода команды

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

 

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

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...