Перейти к публикации
Zabqer

[Open Computers] Демоны/Процессы в фоновом режиме

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

Начну с того, что познакомлю тебя с определением Демон:

Де́мон (daemon, dæmon, др.-греч. δαίμων божество) — компьютерная программа в системах класса UNIX, запускаемая самой системой и работающая в фоновом режиме без прямого взаимодействия с пользователем.

 

И тут сразу надо сказать... Что в lua нету многозадачности, потоков.

И как быть? Что если я хочу запустить 2 процесса/задачи одновременно?

И вот как раз я и хочу рассказать тебе как можно "решить" эту проблему.

 

Представим: я хочу написать программу, которая обрабатывала какие-то эвенты... например chat_message из чат-бокса и выводить его на экран вторичного монитора.

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

 

Используем библиотеку "из коробки"

local event = require("event")

Подробнее про её функции можно прочитать в доках.

event.listen(Строка: Имя эвента, Функция: Функция, которая будет выполнена в случае срабатывания эвента) - Новый слушатель событий
event.ignore(Строка: Имя эвента, Функция: Функция указанная выше) - Удаляет слушателя
event.pull(Строка: Имя эвента, [Число: макс. время ожидания]) - ждёт пока случится событие 
event.push(Строка: Имя эвента, [Аргументы]) - создаёт новое событие

Программа:

--Получим аргументы
local mode, screen = ...

--Проверим запущен-ли демон ("Играем в пинг-понг")

event.push("ZP_PING")

e = event.pull("ZP_PONG", 0.3)

--Проверяем аргументы
if mode == "status" then

	if e then

		print("Демон запущен")

	else 

		print("Демон не запущен")

	end

	os.exit()

elseif mode == "exit" then

	if e then

		event.push("ZP_EXIT")

	else 

		print("Демон не запущен!")

	end

	os.exit()

end

--Проверяем запущен ли демон
if e then

	print("Демон уже запущен!")

	os.exit()

end

--Узнаем UUID нашего экрана
local screen = component.get(screen) or component.get("Дефолтный UUID")

--Вывод сообщения на 2-й монитор
function onMess(_, _, _, str)

	oldS = gpu.getScreen()
	
	gpu.bind(screen, false)

	print(str)

	gpu.bind(oldS, false)

end

--Пинг-понг
function ping()
	
	event.push("ZP_PONG")

end

--Выход
function exit()

	event.ignore("chat_message", onMess)
	event.ignore("ZP_PING", ping)
	event.ignore("ZP_EXIT", exit)
	
	os.exit()

end

event.listen("chat_message", onMess)
event.listen("ZP_PING", ping)
event.listen("ZP_EXIT", exit)

Так-же если нужно подождать, повторять одно и тоже событие, то можно использовать:

event.timer(Число: Время, Функция: То, что будет выполнено, [Число: Срабатывания]) - Выполняет функцию через определённый промежуток

Для бесконечного повтора следует использовать math.huge

Так же можно остановить таймер, который повторяется n-ное количество раз, без использования event.cancel() и ID таймера - Достаточно что-бы функция, запущенная таймером вернула false

 

Конечно это не идеальное решение... Но я думаю кому-то точно поможет.

 

Если где-то накосячил - поправте.

 

Пока, что это всё. Задавайте интересующие тебя вопросы внизу ^^

  • good 4

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


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

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×