' 声 明 定 时 器 容 器 窗 体
Private WithEvents oTimer As Timer
' 声 明 定 时 器( 包 括 其 事 件)
Public Event JobStart()
' 声 明 任 务 开 始 事 件
Public Event JobEnd()
' 声 明 任 务 结 束 事 件
Private Sub Class_Initialize()
' - - - - 类 初 始 化 事 件 - - - -
' 在 这 里 创 建 定 时 器 窗 体 frmTimeClock
' 并 引 用 定 时 器 oTimer
Set frmTimeClock = New frmClock
Load frmTimeClock
Set oTimer = frmTimeClock.timClock
oTimer.Enabled = False
End Sub
Private Sub Class_Terminate()
' 类 终 止 事 件,
释 放 定 时 器 并 卸 载 定 时 器 窗 体
Set oTimer = Nothing
Unload frmTimeClock
End Sub
Public Sub StartJob()
' 方 法 - 通 知 执 行“ 大 任 务”
oTimer.Interval=100
' 经 过0.1 秒 时 间 开 始 执 行 任 务
oTimer.Enabled = True
End Sub
Private Sub doBigJob()
' 模 拟 的“ 大 任 务”
是 这 个 空 耗 时 间 的 循 环
' 显 然, 这 段 代 码 在 标 准EXE 程 序 中
一 定 会 造 成“ 挂 起” 状 态!
Dim lngTemp As Long
Dim lngSum As Long
For lngTemp = 1 To 10000000
lngSum = lngSum + 1
Next
End Sub
Private Sub oTimer_Timer()
' 定 时 器 周 期 到 时 开 始 执 行 任 务
oTimer.Enabled = False
RaiseEvent JobStart ' 触 发“ 开 始 执 行” 事 件
doBigJob ' 执 行“ 大 任 务”
RaiseEvent JobEnd ' 触 发“ 任 务 结 束” 事 件
End Sub
----现 在 保 存 工 程: 选 择 菜 单 文 件> 保 存 工 程, 根 据 提 示 窗 口 选 择 合 适 的 文 件 夹 保 存 所 有 工 程 资 源( 工 程 文 件, 窗 体 文 件, 类 文 件)。
2. 使 用 并 调 试BigJobServer 部 件
----步 骤 一: 选 择 菜 单 运 行> 全 编 译 执 行, 可 以 看 到 除 了Visual Basic 进 入 运 行 工 程 的 状 态 之 外 看 不 到 任 何 窗 体 出 现,ActiveX EXE 部 件 的 调 试 比 较 特 殊: 需 要 在 另 一 个Visual Basic 程 序 中 进 行。----步 骤 二: 最 小 化Visual Basic, 然 后 启 动 另 一 个Visual Basic 的 实 例, 新 建 一 个 标 准EXE 工 程。 选 择 菜 单 工 程> 引 用 , 在 可 引 用 的 部 件 中 我 们 可 以 找 到BigJobServer 部 件, 选 中 该 部 件, 按 “ 确 定” 按 纽 返 回, 这 样 就 建 立 了 应 用 程 序 和 部 件 服 务 器 间 的 联 系。 现 在 可 以 在 这 个 工 程 中 创 建BigJob 类 并 使 用 其 方 法 和 事 件 了。
----步 骤 三: 在 默 认 的 窗 体Form1 上 放 置 如 下 控 件 并 设 置 其 属 性( 方 法 同 前):
| 类 型 | 名 称 | 标 题(Caption 属 性) |
| Label | lblTime | lblTime |
| Label | lblMessage | lblMessage |
| Timer | timClock | ( 无) |
| Command | cmdStart | 执 行 任 务 |
----步 骤 四: 为 该 工 程 编 写 简 单 的 代 码:
Option Explicit
Dim WithEvents myJob As BigJob
' 声 明BigJob 对 像( 包 括 事 件)
Private Sub Form_Load()
Set myJob = New BigJob ' 创 建BigJob 的 实 例
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set myJob = Nothing ' 释
放 对 像
End Sub
Private Sub cmdStart_Click()
myJob.StartJob
' 通 知 对 像 执 行 任 务
End Sub
Private Sub myJob_JobStart()
' 在 对 像 的“ 开 始”
事 件 中 给 用 户 一 些 提 示
lblMessage.Caption = “ 正 在 执 行 任 务
..."
End Sub
Private Sub myJob_JobEnd()
' 在 对 像 的“ 结 束”
事 件 中 给 用 户 一 些 提 示
lblMessage.Caption = “ 任 务 完 成 !"
End Sub
Private Sub timClock_Timer()
'“ 数 字 时 钟” 在 不 间 断 地
显 示 当 前 时 间
lblTime.Caption = Format(Now, “HH:NN:SS")
End Sub
----步 骤 五: 保 存 并 运 行 这 个 测 试 工 程, 会 看 到 如 下 结 果: 当 你 按 下“ 执 行 任 务” 按 纽 后 从 提 示 可 以 知 道 那 个 可 怕 的“ 大 任 务” 已 经 开 始 执 行, 直 到 程 序 提 示 任 务 结 束, 这 期 间 无 论 是 拖 动 窗 体 还 是 时 间 的 显 示 均 不 会 受 到 影 响。 由 此 可 见 程 序 被“ 挂 起” 的 尴 尬 局 面 得 到 了 解 决。
3. 补 充 说 明
- 上 述 程 序 在Visual Basic 6.0 中 文 企 业 版 上 调 试 通 过。
- 要 在 你 的 程 序 中 实 现 这 种 方 法, 可 以 改 进ActiveX EXE 部 件。 比 如 在 类BigJob 中 把doBigJob 过 程 替 换 为 你 的 具 体 任 务; 或 通 过 添 加 属 性 来 传 递 适 当 的 任 务 参 数 等 等。
- 关 于ActiveX EXE 部 件 的 编 译 和 发 布 问 题, 请 参 考《Visual Basic 联 机 手 册》 或MSDN 文 档。








