天天看點

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的能力。

PowerBuilder程式設計新思維2:嵌入(Thread多線程)

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執行個體

PowerBuilder程式設計新思維2:嵌入(Thread多線程)

異步調用執行個體

 隻需一行代碼,實作多線程的異步調用:

i_thread.of_execute(sle_async, "return pb.global.f_amount(10000000)")      
PowerBuilder程式設計新思維2:嵌入(Thread多線程)

順帶說一句,Lua(5000001那個結果)的執行速度還要在PB代碼之上,是以不會有什麼性能問題。

源碼: PowerPlumeDemoV0.2.1.rar

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

<本節完>