love.thread (日本語)
LÖVE 0.7.0 から使用可能 |
このmoduleは以前のバージョンでは非対応です。 |
スレッドを使用して処理を分担できるようにします。
スレッドはメインコードとは個別に独立した Lua 環境であり、メインコードと並列で実行されます。スレッドのコードは別々に実行される関係で、メイン・スレッドのフレーム・レートに悪影響を与えることなく複雑な計算作業を処理するために使用することができます。しかし、スレッドは個々に独立した環境である関係でメイン・スレッドに存在する変数および関数にはアクセスできませんので、スレッド間の通信は制限されています。
全ての LÖVE オブジェクト (userdata) はスレッドを経由してオブジェクトを送信する場合に限り、スレッド間で共有されます。複数のスレッドで同時にオブジェクトを操作する場合に起きる並列性の問題は発生しても問題はありません。
スレッドの開始時に love.thread モジュールのみ読み込まれます。 その他のモジュールは require により別々に読み込む必要があります。
love.graphics および love.window モジュールには一部制限があるためメインスレッドのみで使用できます。 |
love.threaderror コールバックを定義するか Thread:getError を呼び出すまでスレッドのコードが投げてくるエラーは参照できません。 |
型
Channel (日本語) | このオブジェクトは別のスレッド間でデータの送信および受信に使用できます。 | 0.9.0 | |
Thread (日本語) | 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 |
用例
スレッドの一般的用法とチャンネル通信の用法を示した用例です。
-- スレッドで実行するコードです。
-- 専用の Lua ファイルでコードを実行すべきですが説明を簡単にするために、
-- ここで作成します。
local threadCode = [[
-- 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 -- 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 and timer + dt or 0
-- Make sure no errors occured.
local error = thread:getError()
assert( not error, error )
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
関連
- love (日本語)
- love-loader
- returning table from love.thread - LÖVE (love.thread からテーブルを返す方法)
- How works love.threads? - LÖVE (love.thread の動作に関して)
- How to kill thread on any error? - LÖVE (エラーが起きた時にスレッドを停止する方法に関して)
- Threads and channels - LÖVE (スレッドとチャンネルに関して)
- Loading images in a thread - LÖVE (スレッドで画像を読み込む方法に関して)
そのほかの言語
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