Spec-Zone.ru › LÖVE

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

См. также

  • love

© 2006–2020 LÖVE Development Team
Licensed under the GNU Free Documentation License, Version 1.3.
https://love2d.org/wiki/love.thread

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API