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做一些背景音乐控制,后台加载资源的工作,
利用线程通信还可以减少全局变量的使用。
作者:半山
出处:http://www.cnblogs.com/xdao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。