Скриптовые потоки
LuaThread - это встроенный класс для управления скриптовыми потоками, добавленными в версии .021-alpha. Скриптовые потоки, как и функция main, могут быть приостановлены на определённый период времени с помощью функции wait не препятствуя работе игры. В отличие от события main, поток не может быть приостановлен на бесконечный период времени (wait(-1)), но может быть запущен в состоянии паузы, чтобы привести его в действие позднее.
Функции
create
LuaThread thread = lua_thread.create(function func, ...)
Потоки создаются с помощью функции lua_thread.create
. Первым параметром передаётся функция потока, а остальные параметры будут
переданны в поток в качестве аргументов. Функция потока выполняется сразу же после его создания, но её выполнение может быть
приостановленно на определенное время вызовом функции wait. Поток прекращает существование после выхода из функции,
но может быть перезапущен с помощью lua_thread:run.
Все создаваемые потоки наследуют свойство work-in-pause
у скрипта, это может быть индивидуально
изменено для каждого потока при помощи параметра lua_thread.work_in_pause.
create_suspended
LuaThread thread = lua_thread.create_suspended(function func)
Запускает поток приостановленным. Это означает, что он не начнёт выполнение сразу же после создания, а вместо этого будет находиться в ожидании активации функцией lua_thread:run.
Примеры создания потока
-- этот поток выведет 'Hi!' при запуске, подождёт 5 секунд, затем выведет 'Bye.' и завершится function firstThread() print("Hi!") wait(5000) print("Bye.") end function secondThread() -- бесконечные циклы внутри потоков - не проблема while true do wait(1000) print("secondThread() prints this message every second.") end end function thirdThread(id, delay) if id == 5 then -- поток можно завершить изнутри с помощью return return end wait(delay) print("id: " .. id .. ", delay: " .. delay) end function main() -- просто создаём поток. он запустится сразу же lua_thread.create(firstThread) -- создаём другой поток замороженным local thread1 = lua_thread.create_suspended(secondThread) -- зачем-то ждём 3 секунды wait(3000) -- и запускаем этот поток thread1:run() -- можно запускать сразу несколько потоков для одной и той же функции for i = 1, 10 do -- запускаем поток с передачей параметров: индекс и случайная задержка local del = math.random(100, 1500) lua_thread.create(thirdThread, i, del) end -- сопрограмму main всё равно нужно ставить на бесконечное ожидание, даже если есть другие потоки wait(-1) end
Возвращаемый функцией lua_thread.create
объект является экземпляром класса LuaThread и имеет несколько функций и свойств.
Функции-методы
run
lua_thread:run(...)
Выполняет замороженный, выполняющийся или завершённый поток с начала. Все параметры вызова передаются в функцию потока в качестве аргументов.
terminate
lua_thread:terminate()
Принудительно завершает поток.
status
string status = lua_thread:status()
Возвращает статус потока.
Список возможных статусов | Описание |
---|---|
dead | завершён |
suspended | заморожен |
running | выполняется |
yielded | приостановлен |
error | завершён с ошибкой |
Свойства
dead
bool lua_thread.dead
Определяет статус завершённости потока. Только для чтения.
work_in_pause
bool lua_thread.work_in_pause
Определяет исполнение потока во время паузы игры. Чтение/запись.
true
- выполнять во время паузы, false
- не выполнять.