在PB中使用多线程,在网上有大量的文章介绍。不过深刻研究并试着给出更易用的模型的,目前还只有"路人甲cw"的一篇《关于PowerBuilder多线程的一些心得》。编程
由于PB多线程有着许多自然的限制,使用中有不少问题,那么简化模型是个必然的方向。因为咱们引入了LUA脚本,使得多线程模型变得出人意料的简单。多线程
本来的PB线程,依赖于SharedObjectRegister,SharedObjectGet,SharedObjectUnRegister三个函数。依次创建Thread和Callback两个nv对象。这使得多线程的使用开销变得很大。异步
咱们能够参考一下Socket的异步模型,调用统一为一个接口,返回时利用Event事件传递数据。async
好比以下接口:thread.of_execute("pb.f_func()"),做为异步调用的惟一接口,在OnResult事件中接收数据。函数
这就提出了一个新问题:须要具有在Lua中调用PB的能力。性能
在脚本脚言中调用宿主程序,须要设计Embed嵌入式CALLBACK接口。能够充分利用LUA的动态特性,实现对象的惰性绑定。ui
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()
只需一行代码,实现多线程的异步调用:spa
i_thread.of_execute(sle_async, "return pb.global.f_amount(10000000)")
顺带说一句,Lua(5000001那个结果)的执行速度还要在PB代码之上,因此不会有什么性能问题。.net
源码: PowerPlumeDemoV0.2.1.rar
线程
提供了PB10.5 PB11.5 PB12.5三个版本
<本节完>