Привет! В одном скрипте, мне было необходимо сделать задержки, при этом не используя потоки по причине нестабильности мультиплеера из-за его работы в однопотоке.
Поскольку мне были нужны лишь задержки без использования замедляющих поток циклов, я создал небольшую обертку под названием tasks.lua.
Описание: создание задержек между кодом без использования lua_thread, из минусов: торможение основного потока while-true-do при использовании циклов while или repeat-until, а также функции wait
Методы:
Пример использования:
Поскольку мне были нужны лишь задержки без использования замедляющих поток циклов, я создал небольшую обертку под названием tasks.lua.
Описание: создание задержек между кодом без использования lua_thread, из минусов: торможение основного потока while-true-do при использовании циклов while или repeat-until, а также функции wait
Методы:
Lua:
-- добавляет задачу (code может быть как строка с кодом, так и переданной функцией)
function tasks.add(name, code, wait_time) -> возвращает элемент таблицы
-- удаляет задачу по ее названию
function tasks.remove_by_name(name)
-- удаляет задачу по ее элементу
function tasks.remove_by_value(value)
-- получает задачу(элемент) по ее названию
function tasks.get(name)
-- перебирает и выполняет потоки
function tasks.process()
Пример использования:
Lua:
local tasks = require("tasks")
function main()
-- Создаем задачу без имени, выводящую "hello world!" через 100 миллисекунд
local task1 = tasks.add("", [[print("hello world!")]], 100)
task1.wait_time = 123 -- Изменяем время ожидания на 123 миллисекунды
tasks.remove_by_value(task1) -- Удаляем созданную задачу
-- Создаем задачу с именем "send_message", выводящую "task2" через 1000 миллисекунд
local task2 = tasks.add("send_message", [[sampAddChatMessage('task2', -1)]], 1000)
example() -- Вызываем функцию, изменяющую задачу task2
example_print_table() -- Вызываем функцию для создания задачи с переданной функцией
while true do
wait(0)
-- Обрабатываем таски в главном игровом цикле
tasks.process()
end
end
-- Функция примера, изменяющая содержимое задачи с именем "send_message"
function example()
local task = tasks.get("send_message") -- Получаем задачу по имени
task.code = [[sampAddChatMessage('not task2 o_O', -1)]] -- Меняем код задачи на другой
end
-- Функция примера для создания задачи, выводящей содержимое таблицы
function example_print_table()
local my_table = {1, 2, 3, 4, 5}
local code = function()
for i, v in ipairs(my_table) do
print(i, v)
end
end
tasks.add("", code, 500) -- Создаем задачу, передавая таблицу и другие переменные по ссылке
end
Вложения
Последнее редактирование: