Difference between revisions of "love.thread (Русский)"

Line 1: Line 1:
 
{{newin|[[0.7.0]]|070|type=module}}
 
{{newin|[[0.7.0]]|070|type=module}}
Позволяет работать с потоками.
+
Модуль, позволяющий работать с потоками.
{{notice|[[love.graphics (Русский)|love.graphics]] и [[love.thread (Русский)|love.thread]] не дружат друг с другом. Не вызывайте функции love.graphics из [[Thread (Русский)|Thread]].}}
+
 
 +
Потоки это отдельные Lua окружения, запускаемые параллельно основному потоку. В потоках можно производить сложные вычисления и это не будет влиять на фреймрейт самой игры. Но поскольку потоки являются раздельными средами они не могут получить доступ к функциям основного потока и связь между ними ограничена.
 +
 
 +
Практически все LÖVE объекты (userdata) могут быть переданы другому потоку по каналу связи. Вы можете столкнуться с проблемами параллелизма, если одновременно управляете объектом несколькими потоками.
 +
 
 +
Когда [[Thread (Русский)|Поток]] запустится он загрузит лишь один модуль - love.thread. Любой другой LÖVE модуль может быть загружен через [[require]].
 +
 
 +
{{notice|Модули [[love.graphics (Русский)]] и [[love.window (Русский)]] имеют ограничения из-за которых они могут быть использованы только в основном потоке.}}
 +
{{notice|Если вы не определите функцию [[love.threaderror]] или не вызовите [[Thread:getError]] вы не увидите ошибки, которые произошли во время выполнения потока.}}
 +
 
 
== Типы ==
 
== Типы ==
 
{{#ask: [[Category:Types]] [[parent::love.thread (Русский)]] [[Concept:Current]]
 
{{#ask: [[Category:Types]] [[parent::love.thread (Русский)]] [[Concept:Current]]
Line 25: Line 34:
 
}}
 
}}
 
[[Category:Modules]]
 
[[Category:Modules]]
{{#set:Description=Позволяет работать с потоками.}}
+
{{#set:Description=Данный модуль даёт возможность работать с потоками.}}
 
{{#set:Since=070}}
 
{{#set:Since=070}}
 +
== Примеры ==
 +
Простой пример, демонстрирующий как правильно использовать потоки и создавать между ними каналы связи.
 +
<source lang="lua">
 +
-- В переменную threadCode записан код потока. По-хорошему он должен быть
 +
-- помещён в отдельный Lua файл, но для упрощения понимания мы поместили его
 +
-- здесь.
 +
local threadCode = [[
 +
-- Получаем переменные, которые были внесены в thread:start
 +
local min, max = ...
 +
 +
for i = min, max do
 +
    -- Объект Channel используется для коммуникации этого потока с основным,
 +
    -- При каждой итерации поток будет отправлять сообщение, которое
 +
    -- можно прочитать в основном потоке.
 +
    love.thread.getChannel( 'info' ):push( i )
 +
end
 +
]]
 +
 +
local thread -- Объект потока.
 +
local timer  -- Таймер для анимации окружности.
 +
 +
function love.load()
 +
    thread = love.thread.newThread( threadCode )
 +
    thread:start( 99, 1000 )
 +
end
 +
 +
function love.update( dt )
 +
    timer = timer and timer + dt or 0
 +
 +
    -- Убеждаемся, что поток выполняется без ошибок.
 +
    local error = thread:getError()
 +
    assert( not error, error )
 +
end
 +
 +
function love.draw()
 +
    -- Получаем информационный канал и читаем из него сообщение,
 +
    -- полученное из потока, созданного выше
 +
    local info = love.thread.getChannel( 'info' ):pop()
 +
    if info then
 +
        love.graphics.print( info, 10, 10 )
 +
    end
 +
 +
    -- Рисуем анимированный круг, чтобы показать, что созданный поток не влияет на основной.
 +
    love.graphics.circle( 'line', 100 + math.sin( timer ) * 20, 100 + math.cos( timer ) * 20, 20 )
 +
end
 +
</source>
 +
 
== Смотрите также ==
 
== Смотрите также ==
 
* [[parent::love (Русский)]]
 
* [[parent::love (Русский)]]

Revision as of 10:46, 1 August 2018

Available since LÖVE 0.7.0
This module is not supported in earlier versions.

Модуль, позволяющий работать с потоками.

Потоки это отдельные Lua окружения, запускаемые параллельно основному потоку. В потоках можно производить сложные вычисления и это не будет влиять на фреймрейт самой игры. Но поскольку потоки являются раздельными средами они не могут получить доступ к функциям основного потока и связь между ними ограничена.

Практически все LÖVE объекты (userdata) могут быть переданы другому потоку по каналу связи. Вы можете столкнуться с проблемами параллелизма, если одновременно управляете объектом несколькими потоками.

Когда Поток запустится он загрузит лишь один модуль - love.thread. Любой другой LÖVE модуль может быть загружен через require.

O.png Модули love.graphics (Русский) и love.window (Русский) имеют ограничения из-за которых они могут быть использованы только в основном потоке.  


O.png Если вы не определите функцию love.threaderror или не вызовите Thread:getError вы не увидите ошибки, которые произошли во время выполнения потока.  


Типы

Channel (Русский) Объект, который используется для передачи сообщений от потока к потоку. Added since 0.9.0
Thread (Русский) Объект представляющий поток. Added since 0.7.0

Функции

love.thread.getChannel (Русский) Создаёт новый или получает существующий Канал для связи с Потоками. Added since 0.9.0
love.thread.getThread (Русский) Ищет поток и получает его объект. Added since 0.7.0 Removed in 0.9.0
love.thread.getThreads (Русский) Получает массив со всеми потоками. Added since 0.7.0 Removed in 0.9.0
love.thread.newChannel (Русский) Создать безымянный канал. Added since 0.9.0
love.thread.newThread (Русский) Создаёт новый поток из Lua файла или FileData объекта. Added since 0.7.0


Примеры

Простой пример, демонстрирующий как правильно использовать потоки и создавать между ними каналы связи.

-- В переменную threadCode записан код потока. По-хорошему он должен быть
-- помещён в отдельный Lua файл, но для упрощения понимания мы поместили его
-- здесь.
local threadCode = [[
-- Получаем переменные, которые были внесены в thread:start
local min, max = ...

for i = min, max do
    -- Объект Channel используется для коммуникации этого потока с основным,
    -- При каждой итерации поток будет отправлять сообщение, которое
    -- можно прочитать в основном потоке.
    love.thread.getChannel( 'info' ):push( i )
end
]]

local thread -- Объект потока.
local timer  -- Таймер для анимации окружности.

function love.load()
    thread = love.thread.newThread( threadCode )
    thread:start( 99, 1000 )
end

function love.update( dt )
    timer = timer and timer + dt or 0

    -- Убеждаемся, что поток выполняется без ошибок.
    local error = thread:getError()
    assert( not error, error )
end

function love.draw()
    -- Получаем информационный канал и читаем из него сообщение,
    -- полученное из потока, созданного выше
    local info = love.thread.getChannel( 'info' ):pop()
    if info then
        love.graphics.print( info, 10, 10 )
    end

    -- Рисуем анимированный круг, чтобы показать, что созданный поток не влияет на основной.
    love.graphics.circle( 'line', 100 + math.sin( timer ) * 20, 100 + math.cos( timer ) * 20, 20 )
end

Смотрите также

Другие языки