Difference between revisions of "love.thread (日本語)"

(Created page with "{{newin (日本語)|0.7.0|070|type=module}} スレッドを使用して作業を行えるようにします。 スレッドは Lua 環境とは独立しており、メイ...")
 
m
 
(8 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 環境であり、メインコードと並列で実行されます。スレッドのコードは別々に実行される関係で、メイン・スレッドのフレーム・レートに悪影響を与えることなく複雑な計算作業を処理するために使用することができます。しかし、スレッドは個々に独立した環境である関係でメイン・スレッドに存在する変数および関数にはアクセスできませんので、スレッド間の通信は制限されています。
  
全ての LOVE オブジェクト (userdata) はスレッドを経由して参照物を送信する場合のみスレッド間で共有されます。複数のスレッドで同時にオブジェクトを操作する場合に起きる並列性の問題は発生してもかまいません。
+
全ての LÖVE オブジェクト (userdata) はスレッドを経由してオブジェクトを送信する場合に限り、スレッド間で共有されます。複数のスレッドで同時にオブジェクトを操作する場合に起きる並列性の問題は発生しても問題はありません。
  
[[Thread (日本語)|Thread]] を開始したときは、 love.thread モジュールのみ読み込まれます。 その他のモジュールは [[require (日本語)|require]] により別々に読み込む必要があります。
+
[[Thread (日本語)|スレッド]]の開始時に love.thread モジュールのみ読み込まれます。 その他のモジュールは [[require (日本語)|require]] により別々に読み込む必要があります。
  
{{notice|[[love.graphics (日本語)|love.graphics]] および [[love.window (日本語)|love.window]] モジュールには一部制限があるためメインスレッドのみで使用できます。}}
+
{{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 34: Line 34:
 
}}
 
}}
 
[[Category:Modules]]
 
[[Category:Modules]]
{{#set:Description=スレッドを使用して作業を行えるようにします。}}
+
{{#set:Description=スレッドを使用して処理を分担できるようにします。}}
 
{{#set:Since=070}}
 
{{#set:Since=070}}
 +
 
== 用例 ==
 
== 用例 ==
LÖVE 0.9.0 : http://love2d.org/forums/viewtopic.php?f=4&t=76670
+
スレッドの一般的用法とチャンネル通信の用法を示した用例です。
 +
<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>
  
 
== 関連 ==
 
== 関連 ==
 
* [[parent::love (日本語)]]
 
* [[parent::love (日本語)]]
 +
* [[love-loader (日本語)|love-loader]]
 +
* [https://love2d.org/forums/viewtopic.php?t=83505 returning table from love.thread - LÖVE (love.thread からテーブルを返す方法)]
 +
* [https://love2d.org/forums/viewtopic.php?t=84051 How works love.threads? - LÖVE (love.thread の動作に関して)]
 +
* [https://love2d.org/forums/viewtopic.php?t=84133 How to kill thread on any error? - LÖVE  (エラーが起きた時にスレッドを停止する方法に関して)]
 +
* [https://love2d.org/forums/viewtopic.php?t=84135 Threads and channels - LÖVE (スレッドとチャンネルに関して)]
 +
* [https://love2d.org/forums/viewtopic.php?t=3807 Loading images in a thread - LÖVE  (スレッドで画像を読み込む方法に関して)]
  
 
== そのほかの言語 ==
 
== そのほかの言語 ==
 
{{i18n|love.thread}}
 
{{i18n|love.thread}}

Latest revision as of 07:12, 19 July 2019

LÖVE 0.7.0 から使用可能
このmoduleは以前のバージョンでは非対応です。

スレッドを使用して処理を分担できるようにします。

スレッドはメインコードとは個別に独立した Lua 環境であり、メインコードと並列で実行されます。スレッドのコードは別々に実行される関係で、メイン・スレッドのフレーム・レートに悪影響を与えることなく複雑な計算作業を処理するために使用することができます。しかし、スレッドは個々に独立した環境である関係でメイン・スレッドに存在する変数および関数にはアクセスできませんので、スレッド間の通信は制限されています。

全ての LÖVE オブジェクト (userdata) はスレッドを経由してオブジェクトを送信する場合に限り、スレッド間で共有されます。複数のスレッドで同時にオブジェクトを操作する場合に起きる並列性の問題は発生しても問題はありません。

スレッドの開始時に love.thread モジュールのみ読み込まれます。 その他のモジュールは require により別々に読み込む必要があります。

O.png love.graphics, love.window, love.joystick, love.keyboard, love.mouse, および love.touch モジュールには一部制限があるためメインスレッドのみで使用できます。  


O.png love.threaderror コールバックを定義するか Thread:getError を呼び出すまでスレッドのコードが投げてくるエラーは参照できません。  


Channel (日本語) このオブジェクトは別のスレッド間でデータの送信および受信に使用できます。 Added since 0.9.0
Thread (日本語) Thread はスレッドを提供します。 Added since 0.7.0

関数

love.thread.getChannel (日本語) 名前ありスレッドのチャンネルを作成または検索します。 Added since 0.9.0
love.thread.getThread (日本語) スレッドを検索してオブジェクトを取得します。 Added since 0.7.0 Removed in 0.9.0
love.thread.getThreads (日本語) 全てのスレッドを取得します。 Added since 0.7.0 Removed in 0.9.0
love.thread.newChannel (日本語) 名前なしスレッドのチャンネルを新規作成します。 Added since 0.9.0
love.thread.newThread (日本語) ファイル名、文字列または Lua コードのある FileData オブジェクトからスレッドを新規作成します。 Added since 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

関連

そのほかの言語