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

Многопоточка

Вопрос

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

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


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

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

3 минуты назад, skorikoff сказал:

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

while true do
  term1 = tostring(rc1.getHeat()/100) .. '%'
  gpu.setForeground(f_color)
  gpu.setBackground(b_color)
  gpu.set(1, 3, '                           ')
  gpu.setForeground(color1)
  gpu.setBackground(color2)
  gpu.set(1, 3, r1)
  gpu.set(1, 2, term1)
  local tEvent = {pull_e('touch')} 

  for i = 1, #tButtons do 
    if tButtons.visible then 
      if tEvent[3] >= tButtons.X and tEvent[3] <= tButtons.X+tButtons.W and tEvent[4] >= tButtons.Y and tEvent[4] <= tButtons.Y+tButtons.H then 
       blink(i) 
       tButtons.action() 
       break
      end
    end
  end
end

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

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


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

Можно ждать клика нулевое время. Тогда pull_e вернёт либо nil, либо событие клика.

Вот пример:

  ...
  local tEvent = {pull_e(0, 'touch')} 
  if tEvent[1] then
    for i = 1, #tButtons do 
      if tButtons.visible then 
        if tEvent[3] >= tButtons.X and tEvent[3] <= tButtons.X+tButtons.W and tEvent[4] >= tButtons.Y and tEvent[4] <= tButtons.Y+tButtons.H then 
         blink(i) 
         tButtons.action() 
         break
        end
      end
    end
  end
...

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


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, ProgramCrafter сказал:

Можно ждать клика нулевое время.

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

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


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

Можно. Но я не знаю как реализована функция pull_e. Если она использует базовое апи computer, тогда в качестве аргумента computer.pullSignal передайте 0

computer.pullSignal (0)

Если же вы используете библиотеку event из OpenOS, то в event.pull аналогично первым аргументом передайте 0

event.pull (0, eventType)

Однако стоит заметить, что если каждый кадр вы рисуете целиком (очищаете экран, ставите надписи итд), то при таком подходе интерфейс будет, скорее всего, мигать. Хотя это уже другая тема, здесь поможет двойная буферизация.

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


Ссылка на сообщение
Поделиться на других сайтах
6 минут назад, Anon сказал:

Можно. Но я не знаю как реализована функция pull_e. Если она использует базовое апи computer, тогда в качестве аргумента computer.pullSignal передайте 0

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

9 минут назад, Anon сказал:

Однако стоит заметить, что если каждый кадр вы рисуете целиком (очищаете экран, ставите надписи итд), то при таком подходе интерфейс будет, скорее всего, мигать. Хотя это уже другая тема, здесь поможет двойная буферизация.

Судя по коду, в кадре обновляются лишь две строки. Вряд ли ради них стоит подтягивать двойную буферизацию.

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


Ссылка на сообщение
Поделиться на других сайтах
6 часов назад, Anon сказал:

Можно. Но я не знаю как реализована функция pull_e. Если она использует базовое апи computer, тогда в качестве аргумента computer.pullSignal передайте 0


computer.pullSignal (0)

Если же вы используете библиотеку event из OpenOS, то в event.pull аналогично первым аргументом передайте 0


event.pull (0, eventType)

Однако стоит заметить, что если каждый кадр вы рисуете целиком (очищаете экран, ставите надписи итд), то при таком подходе интерфейс будет, скорее всего, мигать. Хотя это уже другая тема, здесь поможет двойная буферизация.

Тогда под это придётся подтягивать какой-то таймер, чтобы программа ожидала n количество секунд, а потом только передавала нолик.
Весь интерфейс полностью не перерисовывается, конечно, это было бы долговато, учитывая, что этот кусок кода - только две кнопки и две строки текста, а таких будет штук 6. Поэтому да, таймаут пулла - панацея в данной ситуации.

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


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

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

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

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

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

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

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

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

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


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