Difference between revisions of "love.thread"
m |
|||
(48 intermediate revisions by 16 users not shown) | |||
Line 1: | Line 1: | ||
− | {{newin|[[0.7.0]]|type=module}} | + | {{newin|[[0.7.0]]|070|type=module}} |
Allows you to work with threads. | Allows you to work with threads. | ||
− | {{notice|[[love.graphics]] and [[love. | + | |
+ | Threads are separate Lua environments, running in parallel to the main code. As their code runs separately, they can be used to compute complex operations without adversely affecting the frame rate of the main thread. However, as they are separate environments, they cannot access the variables and functions of the main thread, and communication between threads is limited. | ||
+ | |||
+ | All LÖVE objects (userdata) are shared among threads so you'll only have to send their references across threads. You may run into concurrency issues if you manipulate an object or global love state on multiple threads at the same time. | ||
+ | |||
+ | |||
+ | When a [[Thread]] is started, it only loads [[love.data]], [[love.filesystem]], and love.thread module. Every other module has to be loaded with [[require]]. | ||
+ | |||
+ | |||
+ | LÖVE provides a default implementation of the [[love.threaderror]] callback in order to see errors from threads. It can be overwritten and customized, and [[Thread:getError]] can also be used. | ||
+ | |||
+ | |||
+ | {{notice|The [[love.graphics]], [[love.window]], [[love.joystick]], [[love.keyboard]], [[love.mouse]], and [[love.touch]] modules have several restrictions and therefore can only be used in the main thread.}} | ||
+ | {{notice|If LÖVE is programmatically [[love.event.quit|restarted]], all active threads must stop their work and the main thread must [[Thread:wait|wait]] for them to finish, otherwise LOVE may fail to start again.}} | ||
+ | |||
== Types == | == Types == | ||
− | {{#ask: [[Category:Types]] [[parent::love.thread]] | + | {{#ask: [[Category:Types]] [[parent::love.thread]] [[Concept:Current]] |
| headers=hide | | headers=hide | ||
+ | | format=template | ||
+ | | template=ListingFields | ||
+ | | introtemplate=ListingIntro | ||
+ | | outrotemplate=ListingOutro | ||
| ?Description | | ?Description | ||
+ | | ?PrettySince | ||
+ | | ?PrettyRemoved | ||
}} | }} | ||
+ | |||
== Functions == | == Functions == | ||
− | {{#ask: [[Category:Functions]] [[parent::love.thread]] | + | {{#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=Allows you to work with threads.}} | {{#set:Description=Allows you to work with threads.}} | ||
{{#set:Since=070}} | {{#set:Since=070}} | ||
+ | == Examples == | ||
+ | A simple example showing the general usage of a thread and using channels for communication. | ||
+ | <source lang="lua"> | ||
+ | -- 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 = 0 -- 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 + dt | ||
+ | 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 | ||
+ | </source> | ||
+ | |||
== See Also == | == See Also == | ||
* [[parent::love]] | * [[parent::love]] | ||
+ | * [[love.threaderror]] | ||
== Other Languages == | == Other Languages == | ||
{{i18n|love.thread}} | {{i18n|love.thread}} |
Latest revision as of 00:12, 22 March 2023
Available since LÖVE 0.7.0 |
This module is not supported in earlier versions. |
Allows you to work with threads.
Threads are separate Lua environments, running in parallel to the main code. As their code runs separately, they can be used to compute complex operations without adversely affecting the frame rate of the main thread. However, as they are separate environments, they cannot access the variables and functions of the main thread, and communication between threads is limited.
All LÖVE objects (userdata) are shared among threads so you'll only have to send their references across threads. You may run into concurrency issues if you manipulate an object or global love state on multiple threads at the same time.
When a Thread is started, it only loads love.data, love.filesystem, and love.thread module. Every other module has to be loaded with require.
LÖVE provides a default implementation of the love.threaderror callback in order to see errors from threads. It can be overwritten and customized, and Thread:getError can also be used.
The love.graphics, love.window, love.joystick, love.keyboard, love.mouse, and love.touch modules have several restrictions and therefore can only be used in the main thread. |
If LÖVE is programmatically restarted, all active threads must stop their work and the main thread must wait for them to finish, otherwise LOVE may fail to start again. |
Types
Channel | An object which can be used to send and receive data between different threads. | 0.9.0 | |
Thread | A Thread represents a thread. | 0.7.0 |
Functions
love.thread.getChannel | Creates or retrieves a named thread channel. | 0.9.0 | |
love.thread.getThread | Look for a thread and get its object. | 0.7.0 | 0.9.0 |
love.thread.getThreads | Get all threads. | 0.7.0 | 0.9.0 |
love.thread.newChannel | Creates a new unnamed thread channel. | 0.9.0 | |
love.thread.newThread | Creates a new Thread from a filename, string or FileData object containing Lua code. | 0.7.0 |
Examples
A simple example showing the general usage of a thread and using channels for communication.
-- 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 = 0 -- 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 + dt
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
See Also
Other Languages
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