• Powerbuilder之5年经验谈(一之2)--PB的关键字Create


       返回目录                                         返回  下页

    若需制成电子文档并用于非商业用途方式的传播,请保留以下版权信息,并与笔者联系邮寄副本一份。

    作者:张楠

    网名:SummerHeart

    Email:Costware@163.com

    Bloghttp://summerheart.cnblogs.com/

          http://blog.csdn.net/summerheart

    时间:2008.5.30          Copyright: 2008

    1.2PB的对象和类

    熟悉面向对象的朋友,最先认识的应该是类(Class),但在PB中从头到尾似乎只有对象(Object)而没有类(Class)。类是从对象中抽象出来的概念,它并不能被直接使用,类只有在实例化后才能使用它,实例化的类我们称之为对象(Object)。

    Menu lm_menu

    lm_menu = Create Menu

    严格来讲所有类的创建都该如上的代码一样使用Create关键字(有关Create请参阅相关章节)。然而有种情况例外:如果你自己定义过一个NoVusialObject,你会发现在定义的过程中NoVusialObject的属性页上有个AutoInstantiate的选项。NoVusialObject加上了这个属性,在你使用的时候就不用Create进行创建而像Structure一样定义后就可直接使用。

    在PB中文档至始至终的出现Object这个词,例如介绍菜单时使用的名称是Menu Object 而不是 Menu Class。得承认PB的这种做法在概念上有误导程序员的可能,至少开始时我就是这样的以为对象就是类。但对于我们程序员来计,应该有Class与Object是有分别的这么个概念。为了概念上不至于混淆,笔者将在本系列文章中一贯的遵循这种概念上的叫法。

    1.3 值得注意的几个关键字

    1.3.1 Create的适合场合

    Create是用来创建对象用的,可以说几乎所有的类都需要创建。它有两种使用形式:

     

          listview lv_view

    1.lv_view = Create listview

    2. lv_view = Create using "listview" 

     

    所有的类(参见PB对象与类)在使用前都应该使用Create进行创建,然而有几种场合下不需要这么做,比如:

    1.      你定义了一个窗口,在代码中,你不需要使用Create,而是直接Open()就可以显示该窗口了;

    2.      对于窗口中的控件,你可以直接使用控件而不需要手动Create;

    3.      SQLCA对象可以直接使用,其实它是一个transaction的全局对象。

    情况1、2,用Create然后再open、或show是不会显示窗口的,但可以对窗窗口的属性或窗口上的控件可以引用了。说明对象已经被创建,但为什么没显示,答案看来只有Sybase才能回答了。但我在这想说的是open他包括了对窗口及窗口中的控件的创建过程,所以在我们写代码时近量不要总是只用open来打开窗口,特别是经常会多次打开同一窗口时,因为创建会消耗系统时间,而应该这么写:
    If not IsValid (w_mywin)  then
        
    Open(w_mywin)
    End if 
     

    不妨作个测试,测试1代码如下:

    int i,t1 ,t2
    t1 
    = cpu()
    for i =1 to 10000
        
    open(  w2 )
    next
    t2 
    = cpu() –t1
    messagebox("",t2)

    以上代码写在application对象的open事件里,w2是个只带一个buttonmain!窗口,最终编译成exe运行几次后,t2显示的时间650-700毫秒左右。让我们再作个测试,测试2代码如下:

    int i,t1 ,t2
    t1 
    = cpu()
    for i =1 to 10000
    if not invalid(w2) then
            
    open(  w2 )
    end if
    next
    t2 
    = cpu() –t1
    messagebox("",t2)
     

    同样最终编译成exe运行几次后,t2显示的时间30--50毫秒之间。由以上两个例子可以看出,Open是很花时间的,因为它在每次执行时都要创建窗口。

    当然,光这样还说明不了系统在Create花费的时间,我们不妨把上述的例子作个修改:

    Window lw_win       //开头加上此定义

    测试1的循环里改为(测试1-)

    lw_win =Create w2

    测试2的循环里改为(测试2-1):

    If not invalid(lw_win) then

       lw_win =Create w2

    end if

    同样的分别编译后再运行,测试1-1的时间在250-300之间,而测试2-1的时间始终为0毫秒

    由此可以看出PBCreate上花费的时间是很多的。不仅如此,创建出来的对象,在用不着的时候,PB不得不再调用垃圾回收器进行回收,这又将时一笔额外的时间开销。而使用isValid则可大大的减少这两方面不必要的花费。就这一点而言,NoVusialObject对象更应该注意这一点,一则防止上述的时间花费问题,二则防止出现对象未创建就直接使用的情况发生。

    至此,既然前面我们已经探讨了window对象创建的时间问题,不妨我们再进一步探讨下window的创建都要做哪些事情。细心的朋友可能已经发现上述的测试1和测试11分别是对窗口用了OpenCreate的工作,而二者之间消耗的时间前者是后者的两倍,为什么?这需要我们来了解下window程序的窗口创建过程。

    写过WIN32程序的朋友对这点自然可以明白,在用WIN32编程中要创建一个窗口需要做几步工作:1.注册窗口类;2.创建窗口;3.显示窗口;4.在屏幕上绘制窗口;5.进行窗口消息循环。以下是显示一个最简单的WIN32窗口的例子。
    Code
     

    窗口产生的大致流程图如下,标在①②③④的为消息循环的顺序,这个循环一直会循环反复,直到中接收到WM_QUIT这个消息才退出循环结束程序运行。


     

    由此可以看到,窗口的创建时间消耗大部分时间是在消息循环中。在做前面的4个测试时你可能会发现,用Create的例子执行后并没有窗口显示。而用open的会显示窗口。原因很简单,PB在执行Create时仅仅是创建了窗口及窗口中的控件,而并没有“显示窗口”,更没有让窗口进行“消息循环”。怎么样说明这一点呢,很简单,只要在窗口中的某个控件的constructor事件中写条messagebox语句就知道了。执行Create后并不会弹出messagebox来,但你可以以mywin.mycontrl.property的形式对控件的属性进行操作,说明1.窗口创建时,连同窗口里的控件也被创建;2.窗口创建后,PB没有让窗口接受任何的事件,至于Windows产出的WM_CREATE事件也许产生了也许并未产生,只有Sybase知道了。然而用Open打开的窗口,不用说是执行了完整的窗口产生过程,并开始了消息循环的。而且控件的constructor事件会被先执行,即显示窗口之前会弹出messagebox对话框。

    情况3,是因为SQLCAapplication的附加属性里被字义为全局对象变量。

    对于Create using 其实PB中不只Create可以带using,像Connect 等也可以带using,这种作为使用程序变的更加灵活。通过一个字符串进行对象创建,这种技术是需要一种叫RTTI(运行时类型识别)技术才能做到的。也就是若你有类的继承关系如下:

    Windowàmywin1àmywin2

    那么你可以使用

    Window lw_win

    lw_win = create using "mywin2"

    就能创建窗口mywin2,这里的lw_win其实相当于指向一个mywin2对象的指针。Using将在后面的章节以实例作应用性讲解。
     返回目录                                         返回  下页
  • 相关阅读:
    php中的int参数
    php中parse_url函数的源码及分析
    记一次对python反弹shell的分析
    系统管理常用命令
    Linux内核参数注释与优化
    常见/dev/mapper/centos-root扩容
    使用Hbase快照将数据输出到互联网区测试环境的临时Hbase集群
    Postgres安装详解
    CentOS6.5生产环境系统安装
    Kafka跨网络访问设置
  • 原文地址:https://www.cnblogs.com/SummerHeart/p/1211749.html
Copyright © 2020-2023  润新知