Tolua使用笔记四:lua中的多线程与数组的获取
来源:互联网 发布:中国2017网络闭关锁国 编辑:程序博客网 时间:2024/06/01 10:34
原文地址: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的全部知识点了,
- Tolua使用笔记四:lua中的多线程与数组的获取
- Tolua使用笔记四:lua中的多线程与数组的获取
- Tolua使用笔记一:开始使用Tolua的准备工作与lua文件读取方法
- Tolua使用笔记一:开始使用Tolua的准备工作与lua文件读取方法
- Lua&tolua++与c++的使用
- Tolua使用笔记二:lua与C#的函数,变量交互方法
- Tolua使用笔记五:lua中遍历访问c#的Dictionary类对象与枚举类型
- Tolua使用笔记二:lua与C#的函数,变量交互方法
- Tolua使用笔记五:lua中遍历访问c#的Dictionary类对象与枚举类型
- ToLua学习笔记,获取全局lua表,局部lua表
- Tolua使用笔记六:在lua中操作C#的委托事件与在lua中对Unity的GameObject的操作
- Tolua使用笔记六:在lua中操作C#的委托事件与在lua中对Unity的GameObject的操作
- Lua调用C函数:tolua++ 的使用
- 【lua】使用 tolua 实现 lua 与 c++ 交互
- ToLua学习笔记,运行bundle中的lua脚本
- 使用tolua++实现C++与LUA相互调用
- 使用tolua++实现C++与LUA相互调用
- 使用tolua++实现C++与LUA相互调用
- X86 MOVSB MOVSW MOVSD MOVSQ 指令详解
- Opencv 分水岭算法用于图像分割
- [Unity&NGUI]如何快速设置NGUI UI,Scroll Bar
- 关于强化学习的一些思考
- mongodb和mysql的区别
- Tolua使用笔记四:lua中的多线程与数组的获取
- Opencv 图像分割: 阈值化分割 区域分割 边缘分割
- Java 几道常见String面试题
- 布局文件的易混淆点
- java集合基础总结
- JavaScript数据类型的强制转化-数值
- 安卓实现按返回键回到桌面以及再一次按返回键退出应用
- UICollectionView纯代码
- anglar 跳转子页面