本文共 4648 字,大约阅读时间需要 15 分钟。
01:
coroutine.create() 创建 coroutine,返回 coroutine, 参数是一个函数,当和 resume 配合使用的时候就唤醒函数调用
coroutine.resume() 重启 coroutine,和 create 配合使用 coroutine.yield() 挂起 coroutine,将 coroutine 设置为挂起状态,这个和 resume 配合使用能有很多有用的效果 coroutine.status() 查看 coroutine 的状态 注:coroutine 的状态有三种:dead,suspended,running,具体什么时候有这样的状态请参考下面的程序 coroutine.wrap() 创建 coroutine,返回一个函数,一旦你调用这个函数,就进入 coroutine,和 create 功能重复 coroutine.running() 返回正在跑的 coroutine,一个 coroutine 就是一个线程,当使用running的时候,就是返回一个 corouting 的线程号02:
--定义协程方式01co=coroutine.create(function(x,y)print(x+y)end)--启动协程coroutine.resume(co,1,1)--2
cp=coroutine.wrap(function(x,y)print(x+y)end)cp(1,40)
03:协程的暂停和重启
--定义协程co=coroutine.create(function(x,y)print(x+y)print(x+y)--暂停协程coroutine.yield(x*y)print(x-y)end)--启动协程res,res1=coroutine.resume(co,1,1)print(res,res1)--重启协程coroutine.resume(co)
04:返回值
--定义协程co=coroutine.create(function(x,y)print(x+y)print(x+y)--暂停协程 返回值在yield方法里coroutine.yield(x*y)print(x-y)return(x*y)end)--启动协程res,res1=coroutine.resume(co,1,1)print(res,res1)--重启协程res2,res3=coroutine.resume(co)print(res2,res3)
05:
获取协程状态--定义协程co=coroutine.create(function(x,y)print(x+y)print(x+y)print(coroutine.status(co))--暂停协程 返回值在yield方法里coroutine.yield(x*y)print(x-y)return(x*y)end)print(coroutine.status(co))--启动协程res,res1=coroutine.resume(co,1,1)print(res,res1)--重启协程res2,res3=coroutine.resume(co)print(coroutine.status(co))print(res2,res3)--suspended--2--2--runningt--rue 1--0--dead
使正在执行的协程挂起,注意是执行完该函数后才会使协程挂起
(1) yeild的参数会作为resume的第二个返回值
(2) 如果对该协程不是第一次执行resume,resume函数传入的参数将会作为yield的返回值
06.示例
-- 打印协程1和协程2的状态function status() print("co1's status :"..coroutine.status(co1).." ,co2's status: "..coroutine.status(co2))end-- 协程1co1 = coroutine.create(function ( a ) print("co1 arg is :"..a) status() -- 唤醒协程2 local stat,rere = coroutine.resume(co2,"2") print("111 co2 resume's return is "..rere) status() -- 再次唤醒协程2 local stat2,rere2 = coroutine.resume(co2,"4") print("222 co2 resume's return is "..rere2) local arg = coroutine.yield("6")end)-- 协程2co2 = coroutine.create(function ( a ) print("co2 arg is :"..a) status() local rey = coroutine.yield("3") print("co2 yeild's return is " .. rey) status() coroutine.yield("5")end)--主线程执行协程co1,传入字符串“main thread arg”stat,mainre = coroutine.resume(co1,"main thread arg")status()print("last return is "..mainre)co1 arg is :main thread arg -- 开始执行协程1,第8行co1's status :running ,co2's status: suspended -- 协程1中,第9行,调用了status()函数co2 arg is :2 -- 协程1中,第12行,调用了resume(),唤醒协程2,调用到24行co1's status :normal ,co2's status: running -- 注意:此时协程1处于normal状态,协程2处于running状态111 co2 resume's return is 3 -- 由于26行,协程2执行了yiled(),协程挂起,参数“3”被返回到协程1,赋值给了12行中resume()的第二个参数,在13行进行此打印co1's status :running ,co2's status: suspended -- 此时协程1被唤醒,处于running状态,协程2处于挂起状态co2 yeild's return is 4 -- 由于17行,协程2被再次唤醒,由于不是第一次调用resume(),参数“4”被赋值给上次26行的yiled()的返回值,打印出来,此时是27行的co1's status :normal ,co2's status: running -- 同第一次,此时协程1处于normal状态,协程2处于running状态222 co2 resume's return is 5 -- 由于第29行执行yield完毕,参数5作为17行的resume()的返回值,在18行进行了打印,注意此时协程2仍未结束,处于挂起状态co1's status :suspended ,co2's status: suspended -- 由于第19行,执行了yield(),参数“6”被返回给33行的mainre,注意:此时协程1挂起,同样也未执行完last return is 6 -- 最终35行进行了打印,mainre的值,也就是resume()的第二个返回值其实就是yidld()的参数
local util = require "xlua.util"class "LuaCoroutine"{ __ctor__ = function(self, mono) self.mono = mono end, WaitForIEnumerator = function(self, enumerato, fun) if self.mono then local co = util.cs_generator( function() coroutine.yield(enumerato) if fun then fun() end end ) return self.mono:StartCoroutine(co) end return nil end, Wait = function(self, time, fun) if self.mono then local co = util.cs_generator( function() if time == 0 then coroutine.yield(CS.UnityEngine.WaitForEndOfFrame()) else coroutine.yield(CS.UnityEngine.WaitForSeconds(time)) end if fun then fun() end end ) return self.mono:StartCoroutine(co) end return nil end, Stop = function(self, co) if self.mono and co then self.mono:StopCoroutine(co) end end, StopAll = function(self) if self.mono then self.mono:StopAllCoroutines() end end, Cancel = function(self) self:StopAll() self.mono = nil end}
转载地址:http://pnrxo.baihongyu.com/