Tolua使用笔记四:lua中的多线程与数组的获取

原文地址:http://blog.csdn.net/qq_30168505/article/details/69788186

案例七:

在这里,总有种被作者套路的赶脚,众所周知,在Lua中不存在那种传统意义上的多线程,所谓的多线程都是基于协程而实现的,所以Lua中的线程也都只是那种协作式的多线程,而无法实现那种抢占式的多线程的效果,这也就导致有些效果我们无法得到实现~~~

如果有的时候真的需要那种抢占式的效果,可以考虑使用我之前提到的那个tolua的作者封装过的协程,功能上赶脚几乎可以替代真正的那种抢占式多线程了

在这个案例之中,其实主要可以学到的就是如何获取到原生的lua线程,并在C#端进行lua线程的挂起,激活等操作
主要核心代码如下:

 string script =
        @"
            function fib(n)
                local a, b = 0, 1
                while n > 0 do
                    a, b = b, a + b
                    n = n - 1
                end
                return a
            end

            function CoFunc(len)
                print('len = '..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;
    //lua线程类型
    LuaThread thread = null;

    void Start () 
    {
        //初始化Lua虚拟机
        state = new LuaState();
        state.Start();
        state.LogGC = true;
        state.DoString(script);

        //从虚拟机中获取到lua函数对象
        LuaFunction func = state.GetFunction("Test");
        func.BeginPCall();
        func.PCall();
        thread = func.CheckLuaThread();   //获取对应的线程对象
        thread.name = "LuaThread";
        func.EndPCall();
        func.Dispose();
        func = null;

        thread.Resume(10);    //运行线程并同时传递参数10
    }
顺便值得说的一句就是,在对lua线程操作的时候,还要在C#的Update中调用如下代码
void Update()
    {
        state.CheckTop();
        state.Collect();
    }
貌似是用于垃圾回收的作用,我大概记得之前也是这个用法,这里暂且留个坑,如果坑了回头一定会补

核心函数:

coroutine.resume()

这样说应该基本上都可以懂了吧,如果还是不理解,请回去好好看一下《lua程序设计》中关于协程的那一章

最后还是想补一句,作者对于这种协作式多线程总的而言还是不甚满意,后期有机会作者将会尝试直接在lua引入C#的多线程以及锁机制,具体的方案等我做出来再说


案例8:

这个部分感觉还是相当有用处的,主要是介绍了对于C#中的数组对象的基本的几种访问方法

核心代码全部在那段lua代码中:

function TestArray(array)
                local len = array.Length
                print('直接输出')
                for i = 0, len - 1 do
                    print('Array: '..tostring(array[i]))
                end

                print('转Table表后输出')
                local t = array:ToTable()                

                for i = 1, #t do
                    print('table: '.. tostring(t[i]))
                end

                local iter = array:GetEnumerator()

                while iter:MoveNext() do
                    print('iter: '..iter.Current)
                end

                local pos = array:BinarySearch(3)
                print('array BinarySearch: pos: '..pos..' value: '..array[pos])

                pos = array:IndexOf(4)
                print('array indexof 4 pos is: '..pos)

                return 1, '123', true
            end
在这里,我们可以得出如下几部分结论:

1 :对于C#中的数组,在lua中,我们可以直接通过下标索引访问,写法形式与C#中完全一致,例如: array[i] , 同时还可以通过直接调用 array.Length 获取到数组的大小,感觉对于这类访问作者已经做的使用极度方便了

2:对于C#中的数组,我们可以调用 array:ToTable() 实现将数组对象转化为对应的lua中的Table表的形式

3:第3中访问方式我也不是很熟悉,好像是将其转化成迭代器格式,具体方法为 array:GetEnumerator()  ,访问元素的时候可以通过调用 iter:Current 来获取到,通过使用方法iter:MoveNext() 来将迭代器的所指位置移至下一个

4:除了上述的方法之外,可以通过方法  array:BinarySerach(元素下表位置) 的方法来获取到数组对应位置的元素

     调用方法 array:IndexOf(数据值)  的方法获取到指定元素的下标的值

实际效果图如下:



以上也就是整个案例8的全部知识点了,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值