预装入对象

原创 2001年07月05日 13:27:00

预装入对象


张健姿
01-6-22 下午 03:17:13


在PowerBuilder 5.0中支持全编译代码,但用于采用这种方法存在编译时间长、编译后可执行文件量大等缺点,所以在不少场合,我们仍采用伪编译方式,就是将装载对象和源代码的PBL文件编译成PowerBuilder的动态链接库(.PBD)。PowerBuilder的动态链接库中装载的是与源程序库中源代码相匹配的二进制表示。在运行时,对象(包括函数)依照"需要时调用"的原则,从.PBD中装入内存,这就使可执行程序的字节数大大缩小,执行效率会提高,而且由于只有那些要用到的对象才被即时装入内存,使系统需要进行内存交换的机会就少得多,因而应用的运行也就更快。
但有时我们也会发现用户在进行打开窗口等操作时系统的响应速度较慢,特别是在客户机的配置较低的情况下,这种情形尤为突出。我们知道,当程序调用一个新的对象时,系统要到各个.PBD文件中查找这个对象,如果这个对象是由其它对象继承而来,那么其所有的祖先对象都需要装入内存。如应用软件十分庞大,这种查找和装入显然是十分消耗时间的。
这里我们介绍一种预装入对象的办法,可以在一定程度上解决这个问题。预装入对象就是改变对象初始装入的时间,也就是说在用户对应用并没有反应速度的要求时装入了对象,而不是在用户需要该对象时才装入(如打开一个窗口时)。预装入对象可以明显地提高性能,这种技术给用户的印象是在用户真正要求系统的响应速度时所有对象的装入都加快了。最适合做这些预装入的地方是在APPLICATION的OPEN事件中。在PowerBuilder 5.0开发工具中并没有直接提供这样的功能,但我们可以用一些简单的技巧来实现它,这就是使用一个非可视化对象。
我们首先应当知道:一些对象,如非可视化对象等,被调用时全部装入内存,而另一些对象,如函数,只装入需要的部分。因此使用一个非可视化对象可能比使用一个全局函数更快,当然还与它的大小和功能有关。
您不必在应用的OPEN事件中预装入所有的对象,而是预装入那些最经常被用作为祖先的对象。具体的做法是将这个非可视化对象定义成一个变量。这个非可视化对象一直保留在内存中直到应用结束,这可使应用更加紧凑。这样做的另一个好处是,一旦您定义了一个对象的指针作为全局变量,就可以在软件 的任何地方利用这个指针,引用这个对象的常量、函数和其它的特性。
具体的步骤可以这样进行:
步骤一:创建一个预装入的对象
创建一个Non_Visual_Object类型的用户对象,将该对象以您选定的名字存盘。在本例中采用NVO_Object_Pre_Loader.
在该对象中,建立一个Powerobject的对象数组叫做IPO_Pre_Loaded_objects[]。Powerobject对象是Pow-erBuilder对象层次中最高层次的对象(见前文《PowerBuilder面向对象的程序设计》),因此它能被分配给任何一个PowerBuilder标准的或自定义对象。另外建立一个整型的变量做为数组的索引,我们叫它为ii_Idx,并且将它初始化为0。这两个变量均为实例变量。
PRIVATE:/*限制对这两个变量的访问权限*/
/*我们假设预装入的对象数最多不超过10,当然开发者也可根据实际情况调整*/
PowerObject IPO_Pre_Loaded_objects[10]
Integer ii_Idx=0
注意,我们应当在这里就预先定义数组的大小,这样可以使这个对象预先保留内存而且在自身预装入时也能运行得更快。
步骤二:创建预装入函数
现在创建一个用户对象函数叫做NVOF_Pre_Load_Object。这个函数有一个参数:APO_Object,它也是Powerobject类型。函数的代码如下。
/*
函数:NVOF_Pre_Load_Object
功能:To pre_load often used ancestor objects
参数:Power Object APO_Object
返回值:integer
1:成功,-1: 失败
*/
ii_Idx++
/*将要预装入的对象赋值给这个数组*/
IPO_Pre_Loaded_Objects[ii_Idx]=APO_Object
/*检验赋值是否成功*/
If isvalid(IPO_Pre_Loaded_objects[ii_Idx])then
Return 1
else
Return -1
end if
步骤三:创建可以放入调用用户对象代码的用户事件
在这个对象上为开发者建立一个可放入对预装入对象调用的代码。我们定义了使用一个"声明"的事件,该事件将在对象的CONSTRUCTOR事件中被触发。我们可以将这个用户事件命名为NVO_UE_DECLARATIONS,并且将下面的代码放入对象的CONSTRUCTOR事件中。
This.Post Event("nvo_ue_declarations")
在NVO_UE_DECLARATION事件中您可以放入对预装入对象的调用。
步骤四:预装入对象
这段代码存在NVO_UE_DECLARATION事件中。可能您的应用需要更多或更少的预装入对象,我们只假设有这样几个常用的祖先对象类w_WindowBase、udw_DataWindow、uo_UserObjectBase和m_MenuBase。这些对象分别代表我们的窗口类、用户对象数据窗口类、用户对象类和菜单类的祖先对象。
NVO_UE_DECLARATON事件中的代码如下:
/*声明指向这些对象的局部变量*/
Window lWindow
UserObject lUO
DataWindow lDW
Menu lMenu
/*对每一个需要预装入的对象,使用Create语句创建一个该对象的实例,并调用预装入函数将这个实例保存在内存中*/
/*创建一个窗口基类的实例*/
lWindow=Create w_WindowsBase
NVOF_Pre_Load_Object(lWindow)
/*创建一个DataW-indow的用户对象基类的实例*/
lDW=Create udw_DataWindowBase
NVOF_Pre_Load_object(lDW)
/*创建一个用户对象的基类实例*/
lUO=uo_UserObjectBase
NVOF_Pre_Load_Object(lUO)
/*创建一个菜单实例*/
lMenu=Create m_MenuBase
NVOF_Pre_Load_Object(lMenu)
一般来讲,动态调用的对象,都是那些用字符串变量调用的对象,将不包含在.EXE文件中。例如,如果您用Open(mywin,"My_Window")打开了一个窗口,My_Window窗口并不自动地包含在您的EXE文件中。如果编译成.PBD文件,则会包含在.PBD当中。但是如果您用这种方法预装入这个对象,该窗口在.PBD和.EXE编译技术下都将被包含。
步骤五:初始化预装入对象
为了使对象进入内存,还剩下最后的一步。我们必须将预装入对象本身装入内存。您可以选择在应用频繁使用部分开始工作前的任何地方做这件事。一般常用的是在APPLICA-TION的OPEN事件中。需要的代码如下:
anvo_object_pre_loader=Create NVO_Object_Pre_loader.
这段程序将建立这个非可视化对象,该可视化对象就会激发对象的声明事件,从而预装入各个对象。
最后一点需提请注意的是,不要忘记在您的APPLI-CATION的CLOSE事件中加上DESTROY anvo_object_pre_loader这样一条语句,否则这个应用将造成所谓的内存漏洞(Memory Leak)。

中央气象局天气预报接口---java实现

一:接口地址 接口地址: http://www.weather.com.cn/data/sk/101010100.html http://www.weather.com.cn/data/cit...
  • a694704123b
  • a694704123b
  • 2015年03月03日 10:53
  • 1750

word 文档中嵌入和链接OLE 对象|Packager-对象包装程序

Packager-对象包装程序1    ㈠、“对象包装程序”概述   “对象包装程序”是一种用于创建可以插入到某个文档中的程序包的工具。   “对象包装程序”窗口有两个窗格。“...
  • haiross
  • haiross
  • 2016年03月25日 16:50
  • 4480

C语言也可以“面向对象”—— C语言实现封装、继承和多态

网上看到一篇讲述C语言面向对象的文章,顿时眼睛一亮,也佩服作者认识的深入。 特此转来与大家分享,网址: http://dongxicheng.org/cpp/ooc/ 1、  概述 ...
  • happy08god
  • happy08god
  • 2014年02月05日 17:48
  • 2424

读书笔记《Effective C++》条款17:以独立语句将newed对象置入智能指针

假设我们有两个函数用来揭示处理程序的优先权,另一个函数用来在某动态分配所得的Widget上进行某些带有优先权的处理: int priority(); void processWidget(std::...
  • u014558668
  • u014558668
  • 2017年05月13日 12:11
  • 100

线程同步,同步锁,重入锁、条件对象

(借鉴自刘望舒的Android进阶之光) 这个很好理解,有些资源是不安全的,如果多个线程同时访问会引起结果的错误,所以我们需要给他加一个同步锁。即synchronized关键字,没有人不熟悉...
  • qq_36523667
  • qq_36523667
  • 2017年12月28日 16:27
  • 39

条款17:以独立的语句将newed对象置入智能指针

本条款的核心思想只有一句话:那就是在使用智能指针管理对象的时候,一定用一条单独的语句将new出来的对象放入智能指针当中去。 下面举个例子说明一下: 假设有如下的代码: class Widget ...
  • IT_iverson
  • IT_iverson
  • 2017年11月30日 14:52
  • 36

.NET项目开发—浅谈面向对象的纵横向关系、多态入口,单元测试(项目小结)

在一般的函数调用情况下,我们都习惯性的将参数传入到某个被调用的方法,这可能就是我们考虑调用方法的惯用思维,但是现在的C#语言得到了很大的提升,我们可以很自然的使用委托来减少函数之间的参数依赖;有时候会...
  • wangqingpei557
  • wangqingpei557
  • 2013年11月20日 20:23
  • 1338

《我的Angular入坑记》——初识scope对象

可以看到,在操作控制器时只传入了一个scope,但这在函数里面是识别为形参的。当我们的网站要最求加载速度的时候往往会去压缩代码文件,而压缩代码文件就会自动将形参替换为如:a 这样的单字母名称,这时网...
  • zzp961224
  • zzp961224
  • 2017年04月14日 23:09
  • 151

effective c++ 条款17 :以独立语句将newed 对象置入智能指针

Store newed objects in smart pointers in standalone statements       c++编译器会优化你的代码,会根据优先权来选择优先执行哪些代...
  • wallwind
  • wallwind
  • 2011年09月24日 23:26
  • 999

ajax处理过程,ajax入门,XMLHttpRequest对象

XMLHttpRequest对象是当今所有AJAX和Web 2.0应用程序的技术基础。尽管软件经销商和开源社团现在都在提供各种AJAX框架以进一步简化XMLHttpRequest对象的使用;但是,我们...
  • liangzou
  • liangzou
  • 2012年04月29日 09:21
  • 317
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:预装入对象
举报原因:
原因补充:

(最多只允许输入30个字)