love.thread
Доступно начиная с LÖVE 0.7.0
Этот модуль не поддерживается в более ранних версиях.
Позволяет работать с потоками.
Потоки — это отдельные среды Lua, работающие параллельно с основным кодом. Поскольку их код выполняется отдельно, они могут использоваться для вычисления сложных операций без отрицательного влияния на частоту кадров основного потока. Однако, поскольку они являются отдельными средами, они не могут получить доступ к переменным и функциям основного потока, а взаимодействие между потоками ограничено.
Все объекты LÖVE (userdata) общие для потоков, поэтому вам нужно отправлять только их ссылки через потоки. Вы можете столкнуться с проблемами конкурентного доступа, если вы манипулируете объектом в нескольких потоках одновременно.
Когда поток Thread запускается, он загружает только love.data, love.filesystem и модуль love.thread. Каждый другой модуль должен загружаться с помощью require.
Модули love.graphics, love.window, love.joystick, love.keyboard, love.mouse и love.touch имеют ряд ограничений и поэтому могут использоваться только в главном потоке.
Если вы не определили обратный вызов love.threaderror или не вызвали Thread:getError, вы не увидите ошибки, которые генерирует код вашего потока.
В Android вам нужно убедиться, что все потоки завершены перед завершением/перезапуском, в противном случае LOVE не сможет запуститься снова!
Типы
| Канал | Объект, который можно использовать для отправки и получения данных между разными потоками. | 0.9.0 | |
| Поток | Поток представляет собой поток. | 0.7.0 |
Функции
| love.thread.getChannel | Создаёт или получает именованный канал потока. | 0.9.0 | |
| love.thread.getThread | Ищет поток и получает его объект. | 0.7.0 | 0.9.0 |
| love.thread.getThreads | Получить все потоки. | 0.7.0 | 0.9.0 |
| love.thread.newChannel | Создаёт новый безымянный канал потока. | 0.9.0 | |
| love.thread.newThread | Создаёт новый поток из файла, строки или объекта FileData, содержащего код Lua. | 0.7.0 |
Примеры
Простой пример, демонстрирующий общее использование потока и использование каналов для взаимодействия.
-- This is the code that's going to run on the our thread. It should be moved
-- to its own dedicated Lua file, but for simplicity's sake we'll create it
-- here.
local threadCode = [[
-- Receive values sent via thread:start
local min, max = ...
for i = min, max do
-- The Channel is used to handle communication between our main thread and
-- this thread. On each iteration of the loop will push a message to it which
-- we can then pop / receive in the main thread.
love.thread.getChannel( 'info' ):push( i )
end
]]
local thread -- Our thread object.
local timer -- A timer used to animate our circle.
function love.load()
thread = love.thread.newThread( threadCode )
thread:start( 99, 1000 )
end
function love.update( dt )
timer = timer and timer + dt or 0
-- Make sure no errors occured.
local error = thread:getError()
assert( not error, error )
end
function love.draw()
-- Get the info channel and pop the next message from it.
local info = love.thread.getChannel( 'info' ):pop()
if info then
love.graphics.print( info, 10, 10 )
end
-- We smoothly animate a circle to show that the thread isn't blocking our main thread.
love.graphics.circle( 'line', 100 + math.sin( timer ) * 20, 100 + math.cos( timer ) * 20, 20 )
end
См. также
© 2006–2020 LÖVE Development Team
Licensed under the GNU Free Documentation License, Version 1.3.
https://love2d.org/wiki/love.thread