PowerBuilder编程新思维2:嵌入(Thread多线程)
PowerBuilder编程新思维2:嵌入(Thread多线程)
在PB中使用多线程,在网上有大量的文章介绍。不过深入研究并试着给出更易用的模型的,目前还只有"路人甲cw"的一篇《关于PowerBuilder多线程的一些心得》。
因为PB多线程有着许多天然的限制,使用中有很多问题,那么简化模型是个必然的方向。由于我们引入了LUA脚本,使得多线程模型变得出人意料的简单。
PB线程模型
原本的PB线程,依赖于SharedObjectRegister,SharedObjectGet,SharedObjectUnRegister三个函数。依次建立Thread和Callback两个nv对象。这使得多线程的使用开销变得很大。
异步调用模型
我们可以参考一下Socket的异步模型,调用统一为一个接口,返回时利用Event事件传递数据。
比如如下接口:thread.of_execute("pb.f_func()"),作为异步调用的唯一接口,在OnResult事件中接收数据。
这就提出了一个新问题:需要具备在Lua中调用PB的能力。
PB的CALLBACK模型
在脚本脚言中调用宿主程序,需要设计Embed嵌入式CALLBACK接口。可以充分利用LUA的动态特性,实现对象的惰性绑定。
1 //============================================ 2 //对象调用说明 3 4 //调用func函数 5 obj.func(arg...) 6 //调用指定sign签名的func函数(解决重载函数调用) 7 obj.func.call(sign, arg...) 8 9 //调用evt事件 10 obj.evt.send(arg...) 11 //调用指定sign签名的evt事件 12 obj.evt.sendto(sign, arg...) 13 14 //属性获取 15 obj.prop.get() 16 //属性设置 17 obj.prop.set(val) 18 19 //============================================ 20 //全局变量访问 21 22 //全局变量var获取 23 pb.global.var.get() 24 //全局变量var设置 25 pb.global.var.set(val) 26 27 //shared变量var获取 28 pb.classname.var.get() 29 //shared变量var设置 30 pb.classname.var.set(val) 31 32 33 //============================================ 34 //全局与类函数访问 35 36 //调用全局func函数 37 pb.global.func(args...) 38 //调用指定sign签名的func函数 39 pb.global.func.call(sign. arg...) 40 41 //调用系统func函数 42 pb.system.func(args...) 43 //调用指定sign签名的系统func函数 44 pb.system.func.call(sign, arg...) 45 46 //调用classname类func函数 47 pb.classname.func(args...) 48 //调用指定sign签名的func函数 49 pb.classname.func.call(sign, arg...) 50 51 52 //============================================ 53 // 创建与销毁 54 55 //创建classname对象obj 56 pb.classname.obj.create(name) 57 //创建classname窗口win 58 pb.classname.win.open(name) 59 60 //对象销毁 61 obj.destroy() 62 //关闭窗口 63 obj.close()
PB的CALLBACK实例
异步调用实例
只需一行代码,实现多线程的异步调用:
i_thread.of_execute(sle_async, "return pb.global.f_amount(10000000)")
顺带说一句,Lua(5000001那个结果)的执行速度还要在PB代码之上,所以不会有什么性能问题。
提供了PB10.5 PB11.5 PB12.5三个版本
<本节完>