love.thread (한국어)

Available since LÖVE 0.7.0
This module is not supported in earlier versions.

멀티 스레딩을 제공하는 모듈입니다.

스레드는 메인 코드로부터 Lua 환경을 분리해 병렬적으로 실행됩니다. 메인 코드의 프레임 레이트를 감소시키는 일 없이 복잡한 연산을 수행할 수 있습니다. 그러나 분리된 환경은 메인 스레드의 변수나 함수에 접근할 수 없고, 스레드 간 통신은 제한되어 있습니다.

모든 LOVE의 객체(또는 유저데이터)는 공유되기 때문에 이들을 다른 스레드에서 사용하려면 객체 내용을 통째로 복사할 필요가 없이 오직 참조만 전달하면 됩니다. 물론 동시에 여러 스레드에서 같은 객체에 접근할 경우 동기화 관련 문제가 발생할 수 있습니다.

스레드는 시작될 때 오직 love.thread 모듈만을 로드합니다. 다른 모든 모듈은 require선언을 통해 명시적으로 불러서 사용해야 합니다.

O.png love.graphicslove.window는 몇몇 제한이 있으니 되도록이면 메인 스레드에서 사용하세요.  


타입

Channel (한국어) 서로 다른 스레드 사이에 데이터를 주고받는 데 사용되는 객체입니다. Added since 0.9.0
Thread (한국어) 스레드를 표현하는 타입입니다. Added since 0.7.0

함수

love.thread.getChannel (한국어) 이름 있는 스레드 채널을 생성하거나 얻어옵니다. Added since 0.9.0
love.thread.newChannel (한국어) 이름 없는 스레드 채널을 생성합니다. Added since 0.9.0
love.thread.newThread (한국어) 루아 파일이나 FileData로부터 새로운 스레드를 생성합니다. Added since 0.7.0


예제

Removed in LÖVE 0.9.0
This example is not supported in that and later versions.

http://love2d.org/forums/viewtopic.php?f=5&t=9934&p=60592&hilit=thread#p60592 에서 가져옴

main.lua

-- 스레드 만들기
thread = love.thread.newThread('thread','thread.lua')
thread:start()

function love.update(dt)
   msg_table      = msg_table or {}
   -- 스레드로부터 "done" 메시지를 받았을 때 실행
   if thread:get('done') then
	  msg_table[1]   = thread:get('number')
	  msg_table[2]   = thread:get('string')
	  msg_table[3]   = tostring(thread:get('condition'))
	  -- 각 메시지마다 \n을 추가해 긴 문자열을 만듭니다.
	  message         = table.concat(msg_table,'\n')
	  -- get image data from the other thread
	  imageData      = imageData or thread:get('image')

	  -- 이미지 초기화
	  image   = love.graphics.newImage(imageData)
   end
   if thread:get('hasCounter') then
	  msg_table[4]   = thread:get('counter')
	  message         = table.concat(msg_table,'\n')
   end
end

function love.draw()
   if image then
	  love.graphics.draw(image,50,50)
   end
   if message then
	  love.graphics.print(message,10,10)
   end
end

thread.lua

-- 새 스레드를 위한 모듈 로드
require 'love.filesystem'
require 'love.image'
require 'love.timer'

-- 스레드의 ID 얻기
thisThread   = love.thread.getThread()
-- 이미지 파일 로드
file      = love.image.newImageData('love.png')

-- 자신의 메시지함에 메시지 넣기
thisThread:set('image',file)
thisThread:set('number',1337)
thisThread:set('string','a string message')
thisThread:set('condition',true)
thisThread:set('done',true)

time0 = love.timer.getTime()
counter = 0

-- 1초에 한 번씩 메시지함에 카운트 수를 전송합니다.
while true do
   timeD = love.timer.getTime() - time0
   if timeD > 1 then
	  counter = counter + 1
	  thisThread:set('counter',counter)
	  thisThread:set('hasCounter',true)
	  time0 = love.timer.getTime()
   end
end

같이 보기

다른 언어