Lua协程coroutine库用法
一.学习Lua协程的目的
1.可以更好的学习和掌握一些Lua框架比如ToLua,因为这些框架可能使用Lua协程
2.Lua协程是Lua语言的一部分,虽然不常用,掌握后可以在遇到某些需求时可以想到用Lua协程可以解决问题。
二.Lua协程概念
和Unity协程的概念类似,Lua协程是可以让函数暂停,在暂停处继续执行方法的机制。
三.协程API
3.1 coroutine.create(func)
接收一个function参数,返回一个thread类型变量(下文称协程对象)
local co = coroutine.create(function ()print("co execute")end)print(co)
3.2 coroutine.status(co)
接收一个协程对象,返回协程状态。一个协程有suspended, running, and dead三种状态。通过coroutine.create创建的协程,其初始状态为suspended,意味着其函数体不会自动执行,下面例子展示了协程的三种状态
co = coroutine.create(function ()print("co execute")print("co 函数体内status:",coroutine.status(co))end)print("co create后status:",coroutine.status(co))coroutine.resume(co)print("co resume后status:",coroutine.status(co))
3.3 coroutine.resume(co)
coroutine.resume方法恢复一个协程的执行,使其状态从suspended变为running
3.4 coroutine.yield()
挂起一个协程,使其状态变为suspended
co = coroutine.create(function ()print("co execute before yield")coroutine.yield()print("co execute after yield")end)coroutine.resume(co)function funcResume()print("funcResume called")coroutine.resume(co)end
if (GUI.Button(new Rect(50, 50, 120, 45), "DoFile")){//strLog = "";LuaFunction luaFunc = lua.GetFunction("funcResume");if (luaFunc != null){luaFunc.BeginPCall();luaFunc.PCall();luaFunc.EndPCall();}}
参考:
Coroutine Basics