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".

O.png love.graphics, love.window, love.joystick, love.keyboard, love.mouse, e love.touch hanno troppe restrizioni, quindi sono disponibili solo per il thread principale.  


O.png 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.  


O.png 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