🦊 FoxWiki

Бесконечный цикл

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

Для этого существует конструкция while true.


Базовая структура

Редактор Lua
1
2
3
4

Условие true всегда истинно, поэтому цикл никогда не завершится сам по себе. Программу можно остановить только:

  • Нажав Ctrl + T вручную
  • Через break внутри цикла
  • Через return или os.shutdown() / os.reboot()

Пример: мониторинг состояния

Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12

Выход через break

Когда наступает определённое условие — выходим из цикла через break:

Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Обязательная пауза

while true без паузы вызовет ошибку Too long without yielding — CraftOS прерывает программы которые слишком долго не отдают управление системе:

Редактор Lua
1
2
3
4
5
6
7
8
9
10

Достаточно минимальной паузы — sleep(0.05) это 50 миллисекунд, почти незаметно.


Демон — программа на постоянной службе

Самый распространённый паттерн для while true — программа-демон, которая слушает команды или события:

Редактор Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

🚀 Задания

Задание 1 Напиши программу-часы: в бесконечном цикле очищай экран и выводи текущее время через textutils.formatTime(os.time(), true). Обновляй каждую секунду.

Задание 2 Напиши интерактивный калькулятор: в бесконечном цикле читай строку через read(). Если введено "exit" — выходи. Иначе — попробуй превратить в число и вывести его квадрат.

Задание 3 Напиши систему повторных попыток: в бесконечном цикле пытайся выполнить gps.locate(). Если вернул координаты — вывести их и выйти. Если нет — подождать секунду и попробовать снова. Максимум 10 попыток.

Задание 4 Объясни разницу между двумя программами. Что будет при запуске каждой?

Редактор Lua
1
2
3
4
5
6
7
8
9
10

Задание 5 Напиши охранного робота: в бесконечном цикле проверяй блок спереди через turtle.detect(). Если блок появился — выведи "Обнаружен объект!" и подай редстоун-сигнал на 2 секунды. Убери сигнал. Продолжай наблюдение.

НазадЦиклы с датчиками