国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

預(yù)裝入對象

2024-07-21 02:09:18
字體:
供稿:網(wǎng)友


收集最實用的網(wǎng)頁特效代碼!

預(yù)裝入對象
張健姿 01-6-22 下午 03:17:13

在powerbuilder 5.0中支持全編譯代碼,但用于采用這種方法存在編譯時間長、編譯后可執(zhí)行文件量大等缺點,所以在不少場合,我們?nèi)圆捎脗尉幾g方式,就是將裝載對象和源代碼的pbl文件編譯成powerbuilder的動態(tài)鏈接庫(.pbd)。powerbuilder的動態(tài)鏈接庫中裝載的是與源程序庫中源代碼相匹配的二進(jìn)制表示。在運行時,對象(包括函數(shù))依照"需要時調(diào)用"的原則,從.pbd中裝入內(nèi)存,這就使可執(zhí)行程序的字節(jié)數(shù)大大縮小,執(zhí)行效率會提高,而且由于只有那些要用到的對象才被即時裝入內(nèi)存,使系統(tǒng)需要進(jìn)行內(nèi)存交換的機會就少得多,因而應(yīng)用的運行也就更快。 但有時我們也會發(fā)現(xiàn)用戶在進(jìn)行打開窗口等操作時系統(tǒng)的響應(yīng)速度較慢,特別是在客戶機的配置較低的情況下,這種情形尤為突出。我們知道,當(dāng)程序調(diào)用一個新的對象時,系統(tǒng)要到各個.pbd文件中查找這個對象,如果這個對象是由其它對象繼承而來,那么其所有的祖先對象都需要裝入內(nèi)存。如應(yīng)用軟件十分龐大,這種查找和裝入顯然是十分消耗時間的。 這里我們介紹一種預(yù)裝入對象的辦法,可以在一定程度上解決這個問題。預(yù)裝入對象就是改變對象初始裝入的時間,也就是說在用戶對應(yīng)用并沒有反應(yīng)速度的要求時裝入了對象,而不是在用戶需要該對象時才裝入(如打開一個窗口時)。預(yù)裝入對象可以明顯地提高性能,這種技術(shù)給用戶的印象是在用戶真正要求系統(tǒng)的響應(yīng)速度時所有對象的裝入都加快了。最適合做這些預(yù)裝入的地方是在application的open事件中。在powerbuilder 5.0開發(fā)工具中并沒有直接提供這樣的功能,但我們可以用一些簡單的技巧來實現(xiàn)它,這就是使用一個非可視化對象。 我們首先應(yīng)當(dāng)知道:一些對象,如非可視化對象等,被調(diào)用時全部裝入內(nèi)存,而另一些對象,如函數(shù),只裝入需要的部分。因此使用一個非可視化對象可能比使用一個全局函數(shù)更快,當(dāng)然還與它的大小和功能有關(guān)。 您不必在應(yīng)用的open事件中預(yù)裝入所有的對象,而是預(yù)裝入那些最經(jīng)常被用作為祖先的對象。具體的做法是將這個非可視化對象定義成一個變量。這個非可視化對象一直保留在內(nèi)存中直到應(yīng)用結(jié)束,這可使應(yīng)用更加緊湊。這樣做的另一個好處是,一旦您定義了一個對象的指針作為全局變量,就可以在軟件 的任何地方利用這個指針,引用這個對象的常量、函數(shù)和其它的特性。 具體的步驟可以這樣進(jìn)行: 步驟一:創(chuàng)建一個預(yù)裝入的對象 創(chuàng)建一個non_visual_object類型的用戶對象,將該對象以您選定的名字存盤。在本例中采用nvo_object_pre_loader. 在該對象中,建立一個powerobject的對象數(shù)組叫做ipo_pre_loaded_objects[]。powerobject對象是pow-erbuilder對象層次中最高層次的對象(見前文《powerbuilder面向?qū)ο蟮某绦蛟O(shè)計》),因此它能被分配給任何一個powerbuilder標(biāo)準(zhǔn)的或自定義對象。另外建立一個整型的變量做為數(shù)組的索引,我們叫它為ii_idx,并且將它初始化為0。這兩個變量均為實例變量。 private:/*限制對這兩個變量的訪問權(quán)限*/ /*我們假設(shè)預(yù)裝入的對象數(shù)最多不超過10,當(dāng)然開發(fā)者也可根據(jù)實際情況調(diào)整*/ powerobject ipo_pre_loaded_objects[10] integer ii_idx=0 注意,我們應(yīng)當(dāng)在這里就預(yù)先定義數(shù)組的大小,這樣可以使這個對象預(yù)先保留內(nèi)存而且在自身預(yù)裝入時也能運行得更快。 步驟二:創(chuàng)建預(yù)裝入函數(shù) 現(xiàn)在創(chuàng)建一個用戶對象函數(shù)叫做nvof_pre_load_object。這個函數(shù)有一個參數(shù):apo_object,它也是powerobject類型。函數(shù)的代碼如下。 /* 函數(shù):nvof_pre_load_object 功能:to pre_load often used ancestor objects 參數(shù):power object apo_object 返回值:integer 1:成功,-1: 失敗 */ ii_idx++ /*將要預(yù)裝入的對象賦值給這個數(shù)組*/ ipo_pre_loaded_objects[ii_idx]=apo_object /*檢驗賦值是否成功*/ if isvalid(ipo_pre_loaded_objects[ii_idx])then return 1 else return -1 end if 步驟三:創(chuàng)建可以放入調(diào)用用戶對象代碼的用戶事件 在這個對象上為開發(fā)者建立一個可放入對預(yù)裝入對象調(diào)用的代碼。我們定義了使用一個"聲明"的事件,該事件將在對象的constructor事件中被觸發(fā)。我們可以將這個用戶事件命名為nvo_ue_declarations,并且將下面的代碼放入對象的constructor事件中。 this.post event("nvo_ue_declarations") 在nvo_ue_declaration事件中您可以放入對預(yù)裝入對象的調(diào)用。 步驟四:預(yù)裝入對象 這段代碼存在nvo_ue_declaration事件中??赡苣膽?yīng)用需要更多或更少的預(yù)裝入對象,我們只假設(shè)有這樣幾個常用的祖先對象類w_windowbase、udw_datawindow、uo_userobjectbase和m_menubase。這些對象分別代表我們的窗口類、用戶對象數(shù)據(jù)窗口類、用戶對象類和菜單類的祖先對象。 nvo_ue_declaraton事件中的代碼如下: /*聲明指向這些對象的局部變量*/ window lwindow userobject luo datawindow ldw menu lmenu /*對每一個需要預(yù)裝入的對象,使用create語句創(chuàng)建一個該對象的實例,并調(diào)用預(yù)裝入函數(shù)將這個實例保存在內(nèi)存中*/ /*創(chuàng)建一個窗口基類的實例*/ lwindow=create w_windowsbase nvof_pre_load_object(lwindow) /*創(chuàng)建一個dataw-indow的用戶對象基類的實例*/ ldw=create udw_datawindowbase nvof_pre_load_object(ldw) /*創(chuàng)建一個用戶對象的基類實例*/ luo=uo_userobjectbase nvof_pre_load_object(luo) /*創(chuàng)建一個菜單實例*/ lmenu=create m_menubase nvof_pre_load_object(lmenu) 一般來講,動態(tài)調(diào)用的對象,都是那些用字符串變量調(diào)用的對象,將不包含在.exe文件中。例如,如果您用open(mywin,"my_window")打開了一個窗口,my_window窗口并不自動地包含在您的exe文件中。如果編譯成.pbd文件,則會包含在.pbd當(dāng)中。但是如果您用這種方法預(yù)裝入這個對象,該窗口在.pbd和.exe編譯技術(shù)下都將被包含。 步驟五:初始化預(yù)裝入對象 為了使對象進(jìn)入內(nèi)存,還剩下最后的一步。我們必須將預(yù)裝入對象本身裝入內(nèi)存。您可以選擇在應(yīng)用頻繁使用部分開始工作前的任何地方做這件事。一般常用的是在applica-tion的open事件中。需要的代碼如下: anvo_object_pre_loader=create nvo_object_pre_loader. 這段程序?qū)⒔⑦@個非可視化對象,該可視化對象就會激發(fā)對象的聲明事件,從而預(yù)裝入各個對象。 最后一點需提請注意的是,不要忘記在您的appli-cation的close事件中加上destroy anvo_object_pre_loader這樣一條語句,否則這個應(yīng)用將造成所謂的內(nèi)存漏洞(memory leak)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 克什克腾旗| 丹东市| 延边| 阿拉善左旗| 辉县市| 新疆| 项城市| 枣强县| 资溪县| 靖远县| 阿鲁科尔沁旗| 五原县| 通渭县| 东兰县| 滦南县| 湖南省| 苗栗市| 繁昌县| 五华县| 甘泉县| 石河子市| 辽阳县| 潞城市| 乐业县| 山阴县| 永川市| 新余市| 西平县| 陵川县| 禹州市| 陵川县| 灌阳县| 涟水县| 仁布县| 常宁市| 曲松县| 石嘴山市| 建昌县| 大兴区| 绥德县| 安丘市|