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代码之上,所以不会有什么性能问题。

源码: PowerPlumeDemoV0.2.1.rar

 提供了PB10.5 PB11.5 PB12.5三个版本

<本节完>

原文地址:https://www.cnblogs.com/windfic/p/10268535.html