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毫秒