lua:luathread

Скриптовые потоки

LuaThread - это встроенный класс для управления скриптовыми потоками, добавленными в версии .021-alpha. Скриптовые потоки, как и функция main, могут быть приостановлены на определённый период времени с помощью функции wait не препятствуя работе игры. В отличие от события main, поток не может быть приостановлен на бесконечный период времени (wait(-1)), но может быть запущен в состоянии паузы, чтобы привести его в действие позднее.

LuaThread thread = lua_thread.create(function func, ...)

Потоки создаются с помощью функции lua_thread.create. Первым параметром передаётся функция потока, а остальные параметры будут переданны в поток в качестве аргументов. Функция потока выполняется сразу же после его создания, но её выполнение может быть приостановленно на определенное время вызовом функции wait. Поток прекращает существование после выхода из функции, но может быть перезапущен с помощью lua_thread:run.
Все создаваемые потоки наследуют свойство work-in-pause у скрипта, это может быть индивидуально изменено для каждого потока при помощи параметра lua_thread.work_in_pause.

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 и имеет несколько функций и свойств.

lua_thread:run(...)

Выполняет замороженный, выполняющийся или завершённый поток с начала. Все параметры вызова передаются в функцию потока в качестве аргументов.

lua_thread:terminate()

Принудительно завершает поток.

string status = lua_thread:status()

Возвращает статус потока.

Список возможных статусов Описание
dead завершён
suspended заморожен
running выполняется
yielded приостановлен
error завершён с ошибкой
bool lua_thread.dead

Определяет статус завершённости потока. Только для чтения.

bool lua_thread.work_in_pause

Определяет исполнение потока во время паузы игры. Чтение/запись.
true - выполнять во время паузы, false - не выполнять.