Difference between revisions of "love.thread (日本語)"
m (Bit improved description.) |
m |
||
(4 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
{{newin (日本語)|[[0.7.0]]|070|type=module}} | {{newin (日本語)|[[0.7.0]]|070|type=module}} | ||
− | + | スレッドを使用して処理を分担できるようにします。 | |
スレッドはメインコードとは個別に独立した Lua 環境であり、メインコードと並列で実行されます。スレッドのコードは別々に実行される関係で、メイン・スレッドのフレーム・レートに悪影響を与えることなく複雑な計算作業を処理するために使用することができます。しかし、スレッドは個々に独立した環境である関係でメイン・スレッドに存在する変数および関数にはアクセスできませんので、スレッド間の通信は制限されています。 | スレッドはメインコードとは個別に独立した Lua 環境であり、メインコードと並列で実行されます。スレッドのコードは別々に実行される関係で、メイン・スレッドのフレーム・レートに悪影響を与えることなく複雑な計算作業を処理するために使用することができます。しかし、スレッドは個々に独立した環境である関係でメイン・スレッドに存在する変数および関数にはアクセスできませんので、スレッド間の通信は制限されています。 | ||
Line 8: | Line 8: | ||
[[Thread (日本語)|スレッド]]の開始時に love.thread モジュールのみ読み込まれます。 その他のモジュールは [[require (日本語)|require]] により別々に読み込む必要があります。 | [[Thread (日本語)|スレッド]]の開始時に love.thread モジュールのみ読み込まれます。 その他のモジュールは [[require (日本語)|require]] により別々に読み込む必要があります。 | ||
− | {{notice|[[love.graphics (日本語)|love.graphics]] | + | {{notice|[[love.graphics (日本語)|love.graphics]], [[love.window (日本語)|love.window]], [[love.joystick (日本語)|love.joystick]], [[love.keyboard (日本語)|love.keyboard]], [[love.mouse (日本語)|love.mouse]], および [[love.touch (日本語)|love.touch]] モジュールには一部制限があるためメインスレッドのみで使用できます。}} |
{{notice|[[love.threaderror (日本語)|love.threaderror]] コールバックを定義するか [[Thread:getError (日本語)|Thread:getError]] を呼び出すまでスレッドのコードが投げてくるエラーは参照できません。}} | {{notice|[[love.threaderror (日本語)|love.threaderror]] コールバックを定義するか [[Thread:getError (日本語)|Thread:getError]] を呼び出すまでスレッドのコードが投げてくるエラーは参照できません。}} | ||
Line 36: | Line 36: | ||
{{#set:Description=スレッドを使用して処理を分担できるようにします。}} | {{#set:Description=スレッドを使用して処理を分担できるようにします。}} | ||
{{#set:Since=070}} | {{#set:Since=070}} | ||
+ | |||
== 用例 == | == 用例 == | ||
− | + | スレッドの一般的用法とチャンネル通信の用法を示した用例です。 | |
+ | <source lang="lua"> | ||
+ | -- スレッドで実行するコードです。 | ||
+ | -- 専用の Lua ファイルでコードを実行すべきですが説明を簡単にするために、 | ||
+ | -- ここで作成します。 | ||
+ | local threadCode = [[ | ||
+ | -- thread:start で送信された値を受信します。 | ||
+ | local min, max = ... | ||
+ | |||
+ | for i = min, max do | ||
+ | -- チャンネルはメインスレッドと当スレッド間通信の処理で使用します。 | ||
+ | -- ループの反復ごとにメインスレッドで回収・送信可能な | ||
+ | -- メッセージを送信します。 | ||
+ | love.thread.getChannel( 'info' ):push( i ) | ||
+ | end | ||
+ | ]] | ||
+ | |||
+ | local thread -- 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() | ||
+ | -- info チャンネルの取得と次のメッセージの回収。 | ||
+ | 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> | ||
== 関連 == | == 関連 == |
Latest revision as of 07:12, 19 July 2019
LÖVE 0.7.0 から使用可能 |
このmoduleは以前のバージョンでは非対応です。 |
スレッドを使用して処理を分担できるようにします。
スレッドはメインコードとは個別に独立した Lua 環境であり、メインコードと並列で実行されます。スレッドのコードは別々に実行される関係で、メイン・スレッドのフレーム・レートに悪影響を与えることなく複雑な計算作業を処理するために使用することができます。しかし、スレッドは個々に独立した環境である関係でメイン・スレッドに存在する変数および関数にはアクセスできませんので、スレッド間の通信は制限されています。
全ての LÖVE オブジェクト (userdata) はスレッドを経由してオブジェクトを送信する場合に限り、スレッド間で共有されます。複数のスレッドで同時にオブジェクトを操作する場合に起きる並列性の問題は発生しても問題はありません。
スレッドの開始時に love.thread モジュールのみ読み込まれます。 その他のモジュールは require により別々に読み込む必要があります。
love.graphics, love.window, love.joystick, love.keyboard, love.mouse, および love.touch モジュールには一部制限があるためメインスレッドのみで使用できます。 |
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
-- チャンネルはメインスレッドと当スレッド間通信の処理で使用します。
-- ループの反復ごとにメインスレッドで回収・送信可能な
-- メッセージを送信します。
love.thread.getChannel( 'info' ):push( i )
end
]]
local thread -- 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()
-- info チャンネルの取得と次のメッセージの回収。
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
関連
- 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