Database 版 (精华区)

发信人: wodeji (西西), 信区: Database
标  题: [转载] PowerBuilder 开 发 系 列 谈 (12) 
发信站: 紫 丁 香 (Tue Sep 29 17:51:27 1998), 站内信件

【 以下文字转载自 Programming 讨论区 】
【 原文由 two 所发表 】


 ---- 在PowerBuilder 5.0 中 支 持 全 编 译 代 码, 但 用 于 采 用 这 种 方 法 存 在 编 译 时
 间 长、 编 译 后 可 执 行 文 件 量 大 等 缺 点, 所 以 在 不 少 场 合, 我 们 仍 采 用 伪 编
 译 方 式, 就 是 将 装 载 对 象 和 源 代 码 的PBL 文 件 编 译 成PowerBuilder 的 动 态 链
 接 库(.PBD)。PowerBuilder 的 动 态 链 接 库 中 装 载 的 是 与 源 程 序 库 中 源 代 码 相
 匹 配 的 二 进 制 表 示。 在 运 行 时, 对 象( 包 括 函 数) 依 照" 需 要 时 调 用" 的 原 则,
 从.PBD 中 装 入 内 存, 这 就 使 可 执 行 程 序 的 字 节 数 大 大 缩 小, 执 行 效 率 会 提
 高, 而 且 由 于 只 有 那 些 要 用 到 的 对 象 才 被 即 时 装 入 内 存, 使 系 统 需 要 进
 行 内 存 交 换 的 机 会 就 少 得 多, 因 而 应 用 的 运 行 也 就 更 快。 

 ---- 但 有 时 我 们 也 会 发 现 用 户 在 进 行 打 开 窗 口 等 操 作 时 系 统 的 响 应 速
 度 较 慢, 特 别 是 在 客 户 机 的 配 置 较 低 的 情 况 下, 这 种 情 形 尤 为 突 出。 我 们
 知 道, 当 程 序 调 用 一 个 新 的 对 象 时, 系 统 要 到 各 个.PBD 文 件 中 查 找 这 个 对
 象, 如 果 这 个 对 象 是 由 其 它 对 象 继 承 而 来, 那 么 其 所 有 的 祖 先 对 象 都 需
 要 装 入 内 存。 如 应 用 软 件 十 分 庞 大, 这 种 查 找 和 装 入 显 然 是 十 分 消 耗 时
 间 的。 

 ---- 这 里 我 们 介 绍 一 种 预 装 入 对 象 的 办 法, 可 以 在 一 定 程 度 上 解 决 这 个
 问 题。 预 装 入 对 象 就 是 改 变 对 象 初 始 装 入 的 时 间, 也 就 是 说 在 用 户 对 应
 用 并 没 有 反 应 速 度 的 要 求 时 装 入 了 对 象, 而 不 是 在 用 户 需 要 该 对 象 时 才
 装 入( 如 打 开 一 个 窗 口 时)。 预 装 入 对 象 可 以 明 显 地 提 高 性 能, 这 种 技 术
 给 用 户 的 印 象 是 在 用 户 真 正 要 求 系 统 的 响 应 速 度 时 所 有 对 象 的 装 入 都
 加 快 了。 最 适 合 做 这 些 预 装 入 的 地 方 是 在APPLICATION 的OPEN 事 件 中。
 在Pow-erBuilder 5.0 开 发 工 具 中 并 没 有 直 接 提 供 这 样 的 功 能, 但 我 们 可 以 用
 一 些 简 单 的 技 巧 来 实 现 它, 这 就 是 使 用 一 个 非 可 视 化 对 象。 

 ---- 我 们 首 先 应 当 知 道: 一 些 对 象, 如 非 可 视 化 对 象 等, 被 调 用 时 全 部 装 入
 内 存, 而 另 一 些 对 象 , 如 函 数, 只 装 入 需 要 的 部 分。 因 此 使 用 一 个 非 可 视
 化 对 象 可 能 比 使 用 一 个 全 局 函 数 更 快, 当 然 还 与 它 的 大 小 和 功 能 有 关。 

 ---- 您 不 必 在 应 用 的OPEN 事 件 中 预 装 入 所 有 的 对 象, 而 是 预 装 入 那 些 最
 经 常 被 用 作 为 祖 先 的 对 象。 具 体 的 做 法 是 将 这 个 非 可 视 化 对 象 定 义 成
 一 个 变 量。 这 个 非 可 视 化 对 象 一 直 保 留 在 内 存 中 直 到 应 用 结 束, 这 可 使
 应 用 更 加 紧 凑。 这 样 做 的 另 一 个 好 处 是, 一 旦 您 定 义 了 一 个 对 象 的 指 针
 作 为 全 局 变 量, 就 可 以 在 软 件   的 任 何 地 方 利 用 这 个 指 针, 引 用 这 个 对
 象 的 常 量、 函 数 和 其 它 的 特 性。 

 ---- 具 体 的 步 骤 可 以 这 样 进 行: 

                     步 骤 一: 创 建 一 个 预 装 入 的 对 象 

 ---- 创 建 一 个Non_Visual_Object 类 型 的 用 户 对 象, 将 该 对 象 以 您 选 定 的 名 字
 存 盘。 在 本 例 中 采 用NVO_Object_Pre_Loader. 

 ---- 在 该 对 象 中, 建 立 一 个Powerobject 的 对 象 数 组 叫
 做IPO_Pre_Loaded_objects[]。Power object 对 象 是Pow-erBuilder 对 象 层 次 中 最 高 层
 次 的 对 象( 见 前 文《PowerBuilder 面 向 对 象 的 程 序 设 计》), 因 此 它 能 被 分 配
 给 任 何 一 个PowerBuilder 标 准 的 或 自 定 义 对 象。 另 外 建 立 一 个 整 型 的 变 量
 做 为 数 组 的 索 引, 我 们 叫 它 为ii_Idx, 并 且 将 它 初 始 化 为0。 这 两 个 变 量 均
 为 实 例 变 量。 

 ----PRIVATE:/* 限 制 对 这 两 个 变 量 的 访 问 权 限*/ 

 ----/* 我 们 假 设 预 装 入 的 对 象 数 最 多 不 超 过10, 当 然 开 发 者 也 可 根 据 实 际
 情 况 调 整*/ 

 ----PowerObject IPO_Pre_Loaded_objects[10] 

 ----Integer ii_Idx=0 

 ---- 注 意, 我 们 应 当 在 这 里 就 预 先 定 义 数 组 的 大 小, 这 样 可 以 使 这 个 对 象
 预 先 保 留 内 存 而 且 在 自 身 预 装 入 时 也 能 运 行 得 更 快。 

                         步 骤 二: 创 建 预 装 入 函 数 

 ---- 现 在 创 建 一 个 用 户 对 象 函 数 叫 做NVOF_Pre_Load_Object。 这 个 函 数 有
 一 个 参 数:APO_Ob ject, 它 也 是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_UserObjec tBase 和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-TIO N 的OPEN 事 件 中。 需 要 的 代
 码 如 下: 

 ----anvo_object_pre_loader=Create NVO_Object_Pre_loader. 

 ---- 这 段 程 序 将 建 立 这 个 非 可 视 化 对 象, 该 可 视 化 对 象 就 会 激 发 对 象 的
 声 明 事 件, 从 而 预 装 入 各 个 对 象。 

 ---- 最 后 一 点 需 提 请 注 意 的 是, 不 要 忘 记 在 您 的APPLI-CATION 的CLOSE 事
 件 中 加 上DESTROY a nvo_object_pre_loader 这 样 一 条 语 句, 否 则 这 个 应 用 将 造
 成 所 谓 的 内 存 漏 洞(Memory Leak) 。 

                       


--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.97.236.132]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: whs.hit.edu.cn]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: cadcam.hit.edu.c]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.411毫秒