Cocos2d-Lua之协同程序

协同程序与操作系统中的线程类似,但工作方式是不同的,例如线程的时间片调度算法,当某个线程的时间片用完,系统会自动让该线程等待,让后面的线程运行。而对于协同程序,除非一个正在运行的协同程序被挂起,否则就一直运行到结束才能让其他协同程序运行。

举个例子:

function coroutineFun()
    local co = coroutine.create(function(a, b)
            for i = 1, 10 do
                print(a + b)
                coroutine.yield()
            end
        end)
    return co
end

local co = coroutineFun()
for i = 1, 11 do
    coroutine.resume(co, i, 6)
    print(coroutine.status(co))
end
coroutine.create(函数)    --创建一个协同程序
coroutine.yield()    --将该协同程序挂起
coroutine.resume(co, i, 6)    --运行协同程序,第一个参数是协同程序名称,后面的是协同程序里函数需要传入的参数
coroutine.status(协同程序名称)    --获取协同程序的状态,并返回状态信息

输出结果:

这里写图片描述

可以看到运行协程时,只有第一次传入的参数起到了作用,后面传入的参数都不被理睬,这就像发射子弹一样,一旦枪口位置和方向决定了,一旦开枪,子弹的运行轨迹就决定了,不会再改变是一个到底,协程就会用来制作这样类似的游戏。

一旦协程被挂起,执行一次就不再执行了,需要不断地resume来继续协程的执行。可以看到,没执行完一次,协程的状态就是suspended(挂起状态),知道全部运行完毕,最后的状态就会变成dead(死亡状态)。

如果这里把协同中的挂起去掉:

function coroutineFun()
    local co = coroutine.create(function(a, b)
            for i = 1, 10 do
                print(a + b)
                --coroutine.yield()
            end
        end)
    return co
end

local co = coroutineFun()
for i = 1, 11 do
    coroutine.resume(co, i, 6)
    print(coroutine.status(co))
end

像这样,输出结果:

这里写图片描述

可以看到协程就会一直运行到结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值