• 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三个版本

    <本节完>

  • 相关阅读:
    centos8.2安装nginx
    Centos8安装PostgreSQL
    PostgreSQL 安装时提示下载元数据失败
    MySQL8定时备份
    Centos8安装Docker
    Centos8安装中文字体
    Centos8源码安装libgdiplus
    MySQL拖拽排序
    MySQL8修改事务隔离级别
    MySQL启动问题
  • 原文地址:https://www.cnblogs.com/windfic/p/10268535.html
Copyright © 2020-2023  润新知