ToLua学习笔记(七) Example 07 LuaThread

22 篇文章 0 订阅
11 篇文章 1 订阅

ToLua学习笔记(七) Example 07 LuaThread

转载请注明出处四川包邮

本篇会讲述LuaThread用法

代码

using UnityEngine;
using System.Collections;
using LuaInterface;

public class TestLuaThread : MonoBehaviour 
{
    string script =
        @"
            -- function fib(n)
                -- local a, b = 0, 1
                -- while n > 0 do
                    -- --a = b, b = a + b
                    -- a, b = b, a + b
                    -- n = n - 1
                -- end

                -- return a
            -- end

            --简化一下方便理解
            function fib(n)
                a = n - 1
                return a
            end

            function CoFunc(len)
                print('Coroutine started')                
                local i = 0
                for i = 0, len, 1 do                    
                    local flag = coroutine.yield(fib(i))
                    --没有就结束
                    if not flag then
                        break
                    end                                      
                end
                print('Coroutine ended')
            end

            function Test()
                local co = coroutine.create(CoFunc)                                
                return co
            end            
        ";

    LuaState state = null;
    LuaThread thread = null;

    void Start () 
    {
        state = new LuaState();
        state.Start();
        state.LogGC = true;
        state.DoString(script);

        LuaFunction func = state.GetFunction("Test");
        func.BeginPCall();
        func.PCall();
        thread = func.CheckLuaThread();
        thread.name = "LuaThread";
        func.EndPCall();
        func.Dispose();
        func = null;

        // 传参
        thread.Resume(10);
    }

    void OnDestroy()
    {
        if (thread != null)
        {
            thread.Dispose();
            thread = null;
        }

        state.Dispose();
        state = null;
    }

    void Update()
    {
        state.CheckTop();
        state.Collect();

        // 每帧调用
        if (thread != null && thread.Resume(true) == (int)LuaThreadStatus.LUA_YIELD)
        {
            object[] objs = thread.GetResult();
            Debugger.Log("lua yield: " + objs[0]);
        }
    }

    void OnGUI()
    {
        if (GUI.Button(new Rect(10, 10, 120, 40), "Resume Thead"))
        {
            if (thread != null && thread.Resume(true) == (int)LuaThreadStatus.LUA_YIELD)
            {
                object[] objs = thread.GetResult();
                Debugger.Log("lua yield: " + objs[0]);
            }
        }
        else if (GUI.Button(new Rect(10, 60, 120, 40), "Close Thread"))
        {
            if (thread != null)
            {                
                thread.Dispose();                
                thread = null;
            }
        }
    }
}

LuaThread用法

我将例子中的代码简化了一下,方便我们理解后面的.因为我在第一次看这个Example的时候也是一头雾水

            -- function fib(n)
                -- local a, b = 0, 1
                -- while n > 0 do
                    -- --a = b, b = a + b
                    -- a, b = b, a + b
                    -- n = n - 1
                -- end

                -- return a
            -- end

            --简化一下方便理解
            function fib(n)
                a = n - 1
                return a
            end

通过LuaFunction.CheckLuaThread();
我们可以获取LuaThread

调用LuaThread.Resume(10);传参

之后在每次执行LuaThread.Resume(true)就可以唤醒线程,让线程执行

之后可以看到按顺序输出了lua yield: 0-9

总结

创建线程LuaFunction.CheckLuaThread();
LuaThread.Resume(10);传参给lua中的线程CoFunc
唤醒线程LuaThread.Resume(true)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值