12.07.2015 Views

VisiBroker Edition

VisiBroker Edition

VisiBroker Edition

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

什 么 是 动 态 调 用 接 口 ?注 :的 潜 在 优 点 是 在 性 能 方 面 。 如 果 在 多 个 目 标 对 象 上 调 用 同 一 方 法 , 则 您 可 以 在 多 个_create_request 调 用 中 重 新 使 用 变 量 组 件 。有 两 种 _create_request 方 法 的 过 载 形 式 , 其 中 一 种 包 括 ContextList 和ExceptionList 参 数 , 而 另 外 一 种 则 不 包 括 。 如 果 您 要 在 调 用 中 传 递 一 个 或 多 个Context 对 象 , 而 且 ( 或 者 ) 您 想 要 调 用 的 方 法 可 能 会 掷 出 一 个 或 多 个 和 户 违 例 ,则 您 必 须 使 用 具 有 特 别 参 数 的 _create_request 方 法 。用 Any 类 型 封 装 变 量目 标 方 法 的 变 量 、 结 果 和 违 例 分 别 指 定 在 被 称 为 Any 的 特 殊 对 象 中 。 一 个 Any 是 一个 可 以 封 装 一 个 任 何 类 型 的 变 量 的 普 通 对 象 。 Any 可 以 容 纳 IDL 中 描 述 的 任 何 类型 。 将 一 个 变 量 作 为 Any 指 定 给 Request 可 以 使 Request 接 受 任 意 的 变 量 类 型 和值 , 而 不 会 使 编 译 器 “ 抱 怨 ” 类 型 不 匹 配 。( 结 果 和 违 例 也 是 如 此 。)一 个 Any 包 含 一 个 TypeCode 和 一 个 值 。 一 个 值 不 过 就 是 一 个 值 , 而 TypeCode 是 一个 描 述 如 何 解 析 该 值 中 的 比 特 的 对 象 ( 即 值 的 类 型 )。 用 于 简 单 IDL 类 型 的 简 单TypeCode 常 量 , 如 long 和 Object, 被 建 入 由 idl2cpp 或 idl2java 编 译 器 产 生 的报 头 文 件 中 。 用 于 IDL 结 构 化 类 型 的 TypeCode, 如 structs、 unions 和 typedefs,必 须 构 建 。 这 样 TypeCode 可 以 递 归 , 因 为 它 所 描 述 的 类 型 可 以 递 归 。 考 虑 一 下 一个 由 long 和 string 组 成 的 struct 。 struct 的 TypeCode 包 含 一 个 long 的TypeCode 和 一 个 string 的 TypeCode 。 如 果 使 用 -type_code_info 选 项 来 调 用 编 译器 , 则 idl2cpp 编 译 器 将 会 为 IDL 文 件 中 结 构 化 类 型 生 成 TypeCodes。 但 是 , 如 果您 在 使 用 DII, 则 您 需 要 在 运 行 期 内 得 到 TypeCodes 。 您 可 以 在 运 行 期 内 从 接 口 仓库 ( 参 阅 第 17 章 " 使 用 接 口 仓 库 ") 中 得 到 TypeCode, 或 者 通 过 调 用ORB::create_struct_tc 或 ORB::create_exception_tc 让 <strong>VisiBroker</strong> ORB 创 建 一个 TypeCode。如 果 您 使 用 _create_request 方 法 , 则 您 需 要 将 Any 封 装 的 目 标 方 法 变 量 置 入 被 称为 NVList 的 另 外 一 个 特 殊 对 象 中 。 不 管 您 怎 样 创 建 Request, 其 结 果 总 会 编 码 为NVList。 本 段 中 所 讲 述 的 关 于 变 量 的 一 切 内 容 也 适 用 于 结 果 。 NV 表 示 命 名 的 值 ,一 个 NVList 包 含 大 量 的 项 目 , 其 中 每 个 项 目 具 有 一 个 名 称 、 一 个 值 和 一 个 标 志 。名 称 是 变 量 的 名 称 , 值 是 Any 封 装 的 变 量 , 而 标 志 表 示 变 量 的 IDL 方 式 ( 如 in 或out)。 Request 的 结 果 表 示 为 一 个 单 名 值 。用 于 发 送 request 的 选 项一 旦 您 创 建 了 一 个 Request 并 为 其 配 置 了 变 量 、 结 果 类 型 和 违 例 类 型 , 您 就 可 以 将它 发 送 给 目 标 对 象 。 有 数 种 方 法 可 以 发 送 一 个 Request。● 最 简 单 的 方 法 是 调 用 Request 的 invoke 方 法 , 在 收 到 回 答 消 息 之 前 , 它 将 一 直阻 塞 。● 更 为 复 杂 而 无 阻 塞 的 方 法 是 Request 的 send_deferred 方 法 。 这 是 使 用 线 程 平 行的 方 法 的 替 代 方 法 。 对 许 多 操 作 系 统 而 言 , send_deferred 方 法 比 分 散 线 程 更 为经 济 。● 如 果 您 使 用 send_deferred 方 法 的 目 的 是 平 行 地 调 用 多 个 目 标 对 象 , 您 可 以 使 用<strong>VisiBroker</strong> ORB 对 象 的 send_multiple_requests_deferred 方 法 。 它 使 用 一 个Request 对 象 序 列 。使 用 动 态 调 用 接 口 18-3

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!