love2d教程34--thread模块

love的thread是一个单独的lua运行环境,与主线程平行。因此可以用线程来处理

处理复杂的计算,不过由于隔离,线程不能访问主线程的变量和方法,而且进程

间通信也受限。
 
可以在线程里共享love的对象(userdata),只需要传递对象引用即可。 同时,
你也可能会在多个线程里操作相同对象时遇到多线程编程中常见的问题,
 
thread启动后,只会加载自身,其它模块需要用require手动加载。 graphics和
window模块只能在主线程里用。
线程之间可以通过消息来通信, 消息支持boolean, string, number, Love userdata,  
简单的表 不支持外部userdata (如Lua's files, LuaSocket, ENet, ...),函数,嵌套表.
可以用  love.thread.getChannel( name )(没有则创建,有则使用原来的)创建一个
通信的频道,在频道里可以使用push发送消息,pop获取消息,频道的具体用法请参考
http://www.love2d.org/wiki/Channel。一个线程里可以使用多个频道,多个线程里
可以用相同的频道通信。
 
没有想到好的例子,下面两个是来自论坛 http://love2d.org/forums/viewtopic.php?f=4&t=76670
的例子。
 
 
1、阻塞模式,这个例子会一直等待,程序会失去响应,可以把thread.lua最后
一行改为c2:demand("")即可
 
-- main.lua
t = love.thread.newThread("thread.lua")
c1 = love.thread.newChannel()
c2 = love.thread.getChannel("cookie")
t:start(c1)  --start()中的参数可以传递到thread里,thread用"..."接收
c2:supply(c1:demand())

 

-- thread.lua
c1 = ...--接收thread start()里传来的参数
c2 = love.thread.getChannel("cookie")
c1:supply("Hello, world!")
c2:push(c1:demand())

 

 
 
2、普通模式
-- main.lua
function love.load()
   thread = love.thread.newThread("thread.lua")
   channel = love.thread.getChannel("test")
   thread:start()
   i = {}
end
function love.update(dt)
   v = channel:pop()
   if v then
      table.insert(i, v)
   end
end
function love.draw()
   love.graphics.print(tostring(i[1]), 10, 10)
end

 

-- thread.lua
c = love.thread.getChannel("test")

c:push("hi")

 

 
注意:demand()和supply()要成对使用,不然就会一直阻塞,程序失去响应。
 
从上面可以看到,可以利用thread做一些背景音乐控制,后台加载资源的工作,
利用线程通信还可以减少全局变量的使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值