使用共享的 CoffeeMonitor

本过程说明如何使用 Connector 对象来引用单个共享的 CoffeeMonitor 对象。

注意 本主题是逐步创建 ActiveX EXE 示例过程中的一部分。选择“创建 ActiveX EXE 部件”,开始本主题。

要在CoffeeWatch 中接收 CoffeeReady 事件,请按照以下步骤执行:

  1. 切换到已加载 CoffeeWatch 工程的 Visual Basic 实例。

  2. 在 CoffeeWatch 工程的“工程资源管理器”窗口中,右键单击“Form1”打开上下文菜单,并选择“查看代码”打开代码窗口。将声明部分中的代码修改为:
    Option Explicit
    Private WithEvents mwcmnTest As CoffeeMonitor
    Private mcctTest As Connector
    

    新变量 mcctTest 将保持对 Connector 对象的引用。字母‘cct’用来说明变量是 Connector 类型的。

  3. 更改 Form1 的 Load 事件中的代码,使它先创建 Connector 对象,然后使用连接器的 CoffeeMonitor 属性获得对共享 CoffeeMonitor 对象的引用。
    Private Sub Form_Load()
    Set mcctTest = New Connector
    Set mwcmnTest = mcctTest.CoffeeMonitor
    End Sub
    
  4. 按 F5 键运行工程。

    将再次每隔十秒收到来自 Coffee 的通知。

  5. 关闭 CoffeeWatch 窗体,返回设计状态。

  6. 切换到 Coffee 工程,并单击“中断”按钮(或在“运行”菜单上选择“中断”)进入中断状态。在“立即”窗口中,键入:
    ?TypeName(gCoffeeWatch)
    

    结果为 Nothing,表示共享的 CoffeeMonitor 对象已被释放。

  7. 单击“结束”按钮返回到设计状态。

将发现:再次运行 Coffee 工程,接着制作 CoffeeWatch.exe 并运行其多个实例。(必须先运行 Coffee 工程,使其类型库信息可被利用)。可在 Coffee 中设置断点,可以观察它为多个客户提供对象时的对象的事件和属性的工作情况。

连接器缺陷

连接器类中有一个缺陷。如果所有的客户都释放了它们的 Connector 对象(而保持对共享 CoffeeMonitor 的引用),最后一个连接器会释放该全局引用。那时,任何创建连接器的客户,就会再生成第二个 CoffeeMonitor,因为新的连接器将发现全局变量 gCoffeeWatch 为 Nothing。如果 CoffeeMonitor 真的使用串行口,则会产生冲突。

示例应用程序 Coffee2.Vbp 和 CoffWat2.Vbp 寻求到了一种解决该缺陷的可能途径。

异步回调方法

另一种通知客户的技术是异步回调方法,在“使用回调方法的异步通知”中将讨论这种方法。回调实现起来比较困难,但它允许部件接收由客户端产生的返回值和错误,性能也稍好些。

示例应用程序 Coffee2.Vbp 和 CoffWat2.Vbp 中有使用回调的 CoffeeReady 的实现。

多线程

没有用户接口的代码部件可以被称作无人监控的执行,这是说它们不与用户交互。对于进程外部件,该选项也能够多线程,这在“建立代码部件”的“可扩展性与多线程”中讨论。

示例应用程序 MTCoffee.vbp 演示了简单的多线程方案。

详细信息 启动和处理事件的基础知识在《Visual Basic 程序员指南》的“用对象编程”中的“给类添加事件”中介绍。部件中的事件在“部件设计的一般准则”的“给类添加事件”中讨论。

循序渐进

本主题是逐步创建 ActiveX EXE 示例过程中的一部分。

要到 请参阅
下一步 创建并测试可执行的 Coffee
从头开始 创建 ActiveX EXE 部件