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