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