zoukankan      html  css  js  c++  java
  • 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做一些背景音乐控制,后台加载资源的工作,
    利用线程通信还可以减少全局变量的使用。
  • 相关阅读:
    面向对象
    模块
    第四十课、前置操作符和后置操作符------------------狄泰软件学院
    uva -- 10766
    poj -- 3468
    poj --3264
    cstring 的重载
    hihocode ---1032
    省赛总结
    13周总结
  • 原文地址:https://www.cnblogs.com/xdao/p/love2d-tutor34.html
Copyright © 2011-2022 走看看