当然,认真的程序员希望确保得到咖啡通知,而不管正在使用什么应用程序。可以为每个希望得到通知的程序创建独立的 CoffeeMonitor 对象,但如果计算机没有那么多串行口,这样做就不行。
一种能使多个客户挂到单个 CoffeeMonitor 对象上的方法是提供一个连接器对象,如以下过程所示。
要创建连接器对象,请按照以下步骤执行:
Option Explicit
Public gCoffeeMonitor As CoffeeMonitor
Public glngUseCount As Long
变量 gCoffeeMonitor
用于保持对单个共享 CoffeeMonitor 的引用。glngUseCount
变量跟踪记录使用 CoffeeMonitor 的 Connector 对象的数目。
Public Property Get CoffeeMonitor() As CoffeeMonitor
Set CoffeeMonitor = gCoffeeMonitor
End Property
连接器的只读的 CoffeeMonitor 属性返回对 CoffeeMonitor 的单个全局实例的引用。
Private Sub Class_Initialize()
If gCoffeeMonitor Is Nothing Then
Set gCoffeeMonitor = New CoffeeMonitor
End If
glngUseCount = glngUseCount + 1
End Sub
客户第一次申请连接器对象时,会创建该全局 CoffeeMonitor。每个连接器对象增加 CoffeeMonitor 的使用计数。
提示 最好在部件创建的第一个对象的 Initialize 事件中初始化部件。这样,将会很少遇到对象创建时的超时问题和死锁,而如果用 Sub Main 来初始化部件就可能会遇到这些问题。
Private Sub Class_Terminate()
glngUseCount = glngUseCount - 1
If glngUseCount = 0 Then
Set gCoffeeMonitor = Nothing
End If
End Sub
正如对象应该释放掉它创建的所有窗体一样,它们应当释放掉它所使用的所有对象。因为对全局 CoffeeMonitor 的引用是在全局变量中,最后一个连接器对象必须把它释放。
注意 当所有的客户都释放了对对象的引用时,已编译了的进程外部件才关闭,除非它具有一个加载的窗体。在编译时, TestForm 一直在运行 Coffee 部件,而 CoffeeMonitor 保持着对 TestForm 的引用。因为 CoffeeMonitor 对象利用全局变量而使自身不终止,所以该部件不会关闭。 在“部件设计的一般准则”的“启动和结束部件”中对此予以讨论。
重要 要确保在设置 Instancing 属性之前, CoffeeMonitor 类就是活动的了。如果设置了错类的 Instancing 属性,则将在运行 CoffeeWatch 时出现错误。
任何客户都可以创建 Connector 类的实例,因为其 Instancing 属性被设置成 MultiUse(缺省值)。客户可以使用 Connector 对象的 CoffeeMonitor 属性来引用单个共享的 CoffeeMonitor 对象。把 CoffeeMonitor 做成 PublicNotCreatable 类,就可以使客户使用共享的全局实例,但是这妨碍了客户创建自己的 CoffeeMonitors。
当提示保存新文件时,使用下列名字。Visual Basic 提供扩展名。
文件 | 文件名 | 扩展名 |
Class module | Coffee_Connector | .cls |
Module | Coffee_Module1 | .bas |
本主题是逐步创建 ActiveX EXE 示例过程的一部分。
要到 | 请参阅 |
下一步 | 使用共享的 CoffeeMonitor |
从头开始 | 创建 ActiveX EXE 部件 |