love.thread (Italiano)
Disponibile da LÖVE 0.7.0 |
Questa/o modulo non è supportata/o nelle versioni precedenti. |
Permette di usare i thread.
I thread, o processi, sono ambienti Lua indipendenti che integrano quello principale svolgendo operazioni in parallelo. Il vantaggio primario della loro indipendenza è che possono svolgere operazioni molto complesse senza far crollare il frame rate del thread principale. Ad ogni modo, dal momento che sono "compartimenti stagni", non possono accedere a variabili o funzioni del processo principale, e la communicazione tra thread è limitata.
Tutti gli oggetti di LÖVE (userdata) sono condivisi tra i thread, quindi è sufficiente passare il riferimento di un oggetto al thread desiderato per usarlo immdiatamente al suo interno. È importante sapere che si potrebbe incorrere in problemi di concorrenza manipolando uno stesso oggetto in molteplici thread allo stesso momento.
Quando si avvia un Thread, questo andrà a caricare solo i moduli love.data, love.filesystem, e love.thread. Ogni altro modulo deve essere caricato usando all'inizio del codice del thread require "love.modulo"
.
love.graphics, love.window, love.joystick, love.keyboard, love.mouse, e love.touch hanno troppe restrizioni, quindi sono disponibili solo per il thread principale. |
Se non viene definita la callback love.threaderror o non viene chiamata Thread:getError non si sarà in grado di vedere gli errori che avvengono all'interno di un thread. |
Su Android, bisogna assicurarsi che tutti i thread siano terminati prima di chiudere o riavviare l'applicazione, altrimenti LÖVE non riuscirà a ripartire! |
Tipi
Funzioni
Esempi
Un semplice esempio per dimostrare l'utlizzo di un thread, e la comunicazione attravero i channel.
-- Questo è il codice che girerà nel thread. Si consiglia di metterlo
-- in un file Lua dedicato, ma per semplicità lo terremo in una stringa
-- qui nel file principale.
local threadCode = [[
-- Riceviamo i dati inviati con thread:start
local min, max = ...
for i = min, max do
-- Un Channel (canale) viene utilizzato per gestire la comunicazione tra questo thread
-- e quello principale. Ad ogni iterazione andiamo ad inserire un messaggio al suo interno,
-- che verrà ricevuto dal processo principale.
love.thread.getChannel( 'info' ):push( i )
end
]]
local thread -- L'oggetto di tipo Thread.
local timer -- Un timer utilizzato per animare il cerchio.
function love.load()
thread = love.thread.newThread( threadCode )
thread:start( 99, 1000 )
end
function love.update( dt )
timer = timer and timer + dt or 0
-- Assicuriamoci che non siano capitati errori.
local error = thread:getError()
assert( not error, error )
end
function love.draw()
-- Otteniamo il riferimento al canale per estrarre l'ultimo messaggio
local info = love.thread.getChannel( 'info' ):pop()
if info then
love.graphics.print( info, 10, 10 )
end
-- Adesso animiamo in maniera fluida il cerchio per mostrare che il thread non blocca il processo principale.
love.graphics.circle( 'line', 100 + math.sin( timer ) * 20, 100 + math.cos( timer ) * 20, 20 )
end
Vedi anche
In altre lingue
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