Difference between revisions of "love.thread (Русский)"
m (type and functions lits changed) |
m (Добавил уведомление о особенности Android версии) |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | {{newin|[[0.7.0]]|type=module}} | + | {{newin|[[0.7.0]]|070|type=module}} |
− | + | Модуль, позволяющий работать с потоками. | |
− | {{notice|[[love. | + | |
+ | Потоки это отдельные Lua окружения, запускаемые параллельно основному потоку. В потоках можно производить сложные вычисления и это не будет влиять на фреймрейт самой игры. Но поскольку потоки являются раздельными средами они не могут получить доступ к функциям основного потока и связь между ними ограничена. | ||
+ | |||
+ | Практически все LÖVE объекты (userdata) могут быть переданы другому потоку по каналу связи. Вы можете столкнуться с проблемами параллелизма, если одновременно управляете объектом несколькими потоками. | ||
+ | |||
+ | Когда [[Thread (Русский)|Поток]] запустится он загрузит лишь один модуль - love.thread. Любой другой LÖVE модуль может быть загружен через [[require]]. | ||
+ | |||
+ | {{notice|Модули [[love.graphics (Русский)|love.graphics]] и [[love.window (Русский)|love.window]] имеют ограничения из-за которых они могут быть использованы только в основном потоке.}} | ||
+ | {{notice|Если вы не определите функцию [[love.threaderror (Русский)|love.threaderror]] или не вызовите [[Thread:getError (Русский)|Thread:getError]] вы не увидите ошибки, которые произошли во время выполнения потока.}} | ||
+ | {{notice|На Android устройствах вы должны убедиться, что все потоки были завершены ДО [[love.event.quit (Русский)|выхода/перезапуска]], иначе при следующем запуске LOVE выдаст ошибку!}} | ||
+ | |||
== Типы == | == Типы == | ||
− | {{#ask: [[Category:Types]] [[parent::love. | + | {{#ask: [[Category:Types]] [[parent::love.thread (Русский)]] [[Concept:Current]] |
| headers=hide | | headers=hide | ||
+ | | format=template | ||
+ | | template=ListingFields | ||
+ | | introtemplate=ListingIntro | ||
+ | | outrotemplate=ListingOutro | ||
| ?Description | | ?Description | ||
+ | | ?PrettySince | ||
+ | | ?PrettyRemoved | ||
}} | }} | ||
== Функции == | == Функции == | ||
− | {{#ask: [[Category:Functions]] [[parent::love. | + | {{#ask: [[Category:Functions]] [[parent::love.thread (Русский)]] [[Concept:Current]] |
| headers=hide | | headers=hide | ||
+ | | format=template | ||
+ | | template=ListingFields | ||
+ | | introtemplate=ListingIntro | ||
+ | | outrotemplate=ListingOutro | ||
| ?Description | | ?Description | ||
+ | | ?PrettySince | ||
+ | | ?PrettyRemoved | ||
}} | }} | ||
[[Category:Modules]] | [[Category:Modules]] | ||
− | {{#set:Description= | + | {{#set:Description=Данный модуль даёт возможность работать с потоками.}} |
+ | {{#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:: | + | * [[parent::love (Русский)]] |
== Другие языки == | == Другие языки == | ||
{{i18n|love.thread}} | {{i18n|love.thread}} |
Latest revision as of 06:46, 17 August 2021
Available since LÖVE 0.7.0 |
This module is not supported in earlier versions. |
Модуль, позволяющий работать с потоками.
Потоки это отдельные Lua окружения, запускаемые параллельно основному потоку. В потоках можно производить сложные вычисления и это не будет влиять на фреймрейт самой игры. Но поскольку потоки являются раздельными средами они не могут получить доступ к функциям основного потока и связь между ними ограничена.
Практически все LÖVE объекты (userdata) могут быть переданы другому потоку по каналу связи. Вы можете столкнуться с проблемами параллелизма, если одновременно управляете объектом несколькими потоками.
Когда Поток запустится он загрузит лишь один модуль - love.thread. Любой другой LÖVE модуль может быть загружен через require.
Модули love.graphics и love.window имеют ограничения из-за которых они могут быть использованы только в основном потоке. |
Если вы не определите функцию love.threaderror или не вызовите Thread:getError вы не увидите ошибки, которые произошли во время выполнения потока. |
На Android устройствах вы должны убедиться, что все потоки были завершены ДО выхода/перезапуска, иначе при следующем запуске LOVE выдаст ошибку! |
Типы
Channel (Русский) | Объект, который используется для передачи сообщений от потока к потоку. | 0.9.0 | |
Thread (Русский) | Объект представляющий поток. | 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 (Русский) | Создаёт новый поток из Lua файла или FileData объекта. | 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
Смотрите также
Другие языки
Dansk –
Deutsch –
English –
Español –
Français –
Indonesia –
Italiano –
Lietuviškai –
Magyar –
Nederlands –
Polski –
Português –
Română –
Slovenský –
Suomi –
Svenska –
Türkçe –
Česky –
Ελληνικά –
Български –
Русский –
Српски –
Українська –
עברית –
ไทย –
日本語 –
正體中文 –
简体中文 –
Tiếng Việt –
한국어
More info