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三個版本

<本節完>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM