预装入对象

对象

预装入对象
张健姿 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)。

时间: 2024-09-08 08:08:26

预装入对象的相关文章

VB.Net中文教程(8) 对象(Object)基本概念

object|对象|概念|教程|中文 主题: 对象(Object)基本概念 ???????????? 内容 ????????????v 1. 何谓「对象导向」? v 2. 认识与寻找对象v 3. 对象之分类与组织v 4. 类别之设计 v 5. 对象之行为v 6. 讯息与运算v 7. 类别之定义 v 8. 着手写 VB程序 大地运转.花开花谢.及枫叶飘零 ...... 是自然界对象之行为.对象行为交互作用﹐造成多采多姿的大自然.软件的对象是自然界对象的抽象表示,软件就逼真地表达自然界的实际景象﹐于

java-Java 未知格式日期字符串如何转换成日期对象

问题描述 Java 未知格式日期字符串如何转换成日期对象 5C 如题,一种未知的日期格式的字符串如何转换为日期对象如值可能是 2015-02-06T03:57:23+00:002014-10-20 03:24:32.0638th Apr 2015 02:276/13/2015 5:47 PM 等等常规的世界日期格式,如何转成日期对象 解决方案 只能把可能的格式都列上,然后一个一个匹配,匹配上的就转换,没有匹配上的不转换. 解决方案二: 只能用正则表达式依次匹配,然后再调用对应的格式解析. 解决方

Node.js 之对象池

大家都知道用Node.js搭建一个简单的http服务器是多么简单的事情,打开记事本贴几句脚本,ctrl+s一下,node  server.js  一个http服务器就这样跑起来了,别看它简单,但性能丝毫不差.   var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello Worldn')

《高阶Perl》——3.8 对象方法里的缓存

3.8 对象方法里的缓存 对象方法,它经常不理解地把缓存的值保存在独立的散列里.考虑一个投资银行写的程序里的Investor对象.该对象表现了银行的一个客户: package Investor; # Compute total amount currently invested sub total { my $self = shift; # ... complex computation performed here ... return $total; } 如果$total不会改变,就可以缓存

《Unreal Engine 4蓝图可视化编程》一第1章 使用蓝图进行对象交互

第1章 使用蓝图进行对象交互 Unreal Engine 4蓝图可视化编程 当开始开发一个游戏时,你想到的第一步应该是建立一个原型.幸运的是,虚幻引擎4和蓝图让基本的游戏功能实现起来比以往任何时候都更容易.这样用户便可以很快地开始测试自己的想法.为了让大家熟悉虚幻编辑器(Unreal Editor)和蓝图(Blueprint),我们将使用一些自带的资源和蓝图建立游戏玩法机制. 本章我们将学习以下内容. 创建新的项目和关卡. 在关卡中置入对象. 通过蓝图改变对象的材质. 使用蓝图编辑器链接所有的蓝

深度剖析 C++ 对象池自动回收技术实现

对象池可以显著提高性能,如果一个对象的创建非常耗时或非常昂贵,频繁去创建的话会非常低效.对象池通过对象复用的方式来避免重复创建对象,它会事 先创建一定数量的对象放到池中,当用户需要创建对象的时候,直接从对象池中获取即可,用完对象之后再放回到对象池中,以便复用.这种方式避免了重复创建耗 时或耗资源的大对象,大幅提高了程序性能.本文将探讨对象池的技术特性以及源码实现. 对象池类图 ObjectPool:管理对象实例的pool. Client:使用者. 适用性: 类的实例可重用. 类的实例化过程开销较

对象池 IObjectPool -- ESBasic 可复用的.NET类库(15)

1.缘起:     对象池应该是一个"历史悠久"的概念了,像我们经常说的线程池.还有ADO.NET中的数据库连接池等,都属于对象池的应用.     我们的应用有时也会碰到需要使用对象池的情况,我举个例子说明一下.假设,我们需要记录某个类MyClass的每个方法每次被调用时方法执行所消耗的时间,而且,这个类是使用在多线程的环境中的,每个方法都可以同时在多个线程中执行,不需要被同步,这样可以使并发达到最大.     好,我们可以使用Stopwatch这个类来准确地记录每个方法的时间,关键是

vb的工具栏、对话框(二)

显示选项代码决定对话框将如何装入内存与如何显示.下表描述各种类型的显示任务以及用来执行这些任务的关键字. Show 方法装入窗体并设置它的 Visible 属性为 True.传递给 Show 方法的参数标识了该对话框的类型.如果 style 参数省略或者设置为 vbModeless或 0(缺省),则对话框为无模式类型,如果 style 参数为 vbModal 或 1,则对话框为模式类型.当选取"确定"或"取消"退出对话框时,可使用 Unload 语句或者 Hide

PB中用Windows API制作位图菜单

许多优秀的软件在窗口菜单的左边显示一个小图片,例如Word,这种菜单图文并茂,使操作者感到非常直观.而对于PowerBuilder来说,它为应用开发了几百个简单实用地函数,对于一般的开发应用已经足够,并不需要扩展函数.然而,我们经常希望为最终用户提供一些PowerBuilder并不能提供的功能,例如这种位图菜单,这时我们就需要外部函数. 外部函数是用其他语言编写的并且存储在动态链接库(DLL)中的函数.一个DLL就是一个包含可以执行的Windows代码的文件.DLL在运行时被动态地装入和链接,并