Исходник Информация Гайд задержки без потоков в LUA

g305noobo

Известный
Автор темы
211
186
Привет! В одном скрипте, мне было необходимо сделать задержки, при этом не используя потоки по причине нестабильности мультиплеера из-за его работы в однопотоке.
Поскольку мне были нужны лишь задержки без использования замедляющих поток циклов, я создал небольшую обертку под названием 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
1712911721150.jpeg
 

Вложения

  • tasks.lua
    2 KB · Просмотры: 1
Последнее редактирование:
  • Эм
  • Ха-ха
Реакции: Fott, Tema05 и Vespan

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,771
11,214
Зачем передавать код в виде строки если можно передать функцию?
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,771
11,214
а для чего передавать функцию?🤔

в моем случае понадобилась именно такая реализация
Ну как минимум это не колхоз и так удобнее (например подсветка синтаксиса и подсказки/автозаполнение в редакторе кода)
 
  • Нравится
Реакции: g305noobo

MrCreepTon

Неизвестный
Всефорумный модератор
2,127
4,714
На мой взгляд практическая польза такого решения оправдана при использовании большого числа функций с задержкой. В ином случае на мой взгляд будет удобнее прицепить GetTickCount напрямую в свой скрипт.
Но за реализацию респект
 
  • Клоун
  • Нравится
Реакции: g305noobo и percheklii

Tema05

Известный
1,442
401
Я дико извиняюсь, а как передавать ссылки на таблицы в этот код? Что если я хочу использовать после задержки переменные из другой области видимости?
 

g305noobo

Известный
Автор темы
211
186
Я дико извиняюсь, а как передавать ссылки на таблицы в этот код? Что если я хочу использовать после задержки переменные из другой области видимости?
видимо с load, loadstring никак
добавил передачу функции, так все работает
 

Похожие темы

  1. Ответы
    49
    Просмотры
    155K
    • Закрыта
    • Решено
    Ответы
    3
    Просмотры
    750
  2. Ответы
    497
    Просмотры
    242K