建立代码部件

来源:互联网 发布:效果图软件 编辑:程序博客网 时间:2024/04/28 14:08

代码部件就是以前所谓的 OLE 服务器,它是用来封装对象的一种对象库,为代码重用提供了一种简便的方法。例如,创建的过程库可以用于 Microsoft Visual Basic,也可以用于支持 Visual Basic for Applications 的桌面应用程序,诸如 Microsoft Office 等。
利用 Visua Basic 企业版,代码部件可以成为企业系统的一部分,在远程计算机上以后台方式提供数据服务与业务规则。与此关系较为密切的章节包括“可扩展性与多线程”和“异步的回调与事件”。

 


 

全局对象与代码库
1.当从其它工程引用该部件时,全局对象的属性和方法将成为全局命名空间的一部分。在创建这个 GlobalMultiUse 类模块的工程内,该类创建的对象全部为普通对象。
2.将一个类的 Instancing 属性设置为 GlobalMultiUse 或 GlobalSingleUse 会使客户程序把这个类的属性和方法当作全局函数来使用,但是在定义这个 GlobalMultiUse 类模块的工程中,从这个类创建的对象并不是全局的。
3.全程命名空间的污染是个很严重的问题。
4.使用 GlobalMultiUse 类的属性和方法的每个客户端都将获得属于自己的一个类实例。换句话说,GlobalMultiUse 中的 “Global” 一词并不意味着“所有客户端共享同一个全局实例”。
5.不能使用全局对象代替 VB 和 VBA 库中的全局过程。这些库总是显示在“引用”对话框的最前面,领先于其它库。如果全局对象中的过程名称与库中的相同,那么只有在过程名前加上类型库名称限定才能访问全局对象的过程。
6.只有进程外部件才可以将类模块的 Instancing 属性设为 GlobalSingleUse。如果这样做,每个客户端的内存都将装入该部件的一个独立实例。这比使用 GlobalMultiUse 对象将需要更多的内存。


 

可扩展性与多线程

Visual Basic 的单元模型线程

7.在 Visual Basic 中,单元模型apartment-model)线程用于保证线程的安全性。单元模型线程的每个线程就好象是一个单元,在该线程上创建的所有对象都存活于该单元之中,它不会觉察到其它单元中的对象。
8.除了维护全局数据的独立拷贝以外, Sub Main 过程会在每个新的单元(即每个新的线程)中执行。否则,就无法为每个线程初始化全局数据。在“设计线程安全 DLL”和“设计多线程进程外部件” 中有关于这个问题的进一步的讨论。
9.Visual Basic 创建的所有部件都使用单元模型,无论该部件是单线程的还是多线程的。单线程的部件只有一个单元,该单元包含部件提供的所有对象。
10.Forms、UserControls、UserDocuments 以及 ActiveX 的设计器都是线程安全的。
11.当改变现有工程的线程模式时,如果工程使用了单线程 ActiveX 控件,则会产生一个错误。Visual Basic 禁止在使用单元线程的工程中使用单线程控件,
12.选择无用户界面执行选项将牺牲所有需要用户交互的窗体,其中包括消息框和系统错误对话框。

单元模型线程化的限制
Visual Basic 中的单元模型线程化具有下述限制。

  • 开发环境不支持多线程调试。如果有 Microsoft Visual Studio ,可以先把单元线程化的部件编译成带调试信息的本机代码,然后使用 Visual Studio 的调试程序来进行调试。如果是测试和调试进程内部件(.dll 和 .ocx 文件)则还需要一个多线程的客户应用程序。
  • MDI 父窗体和子窗体共享数据时所必须采用的方法是很难保证线程安全的。因此,在单元线程化的工程中不允许出现 MDI 窗体。对于单元线程化的 ActiveX DLL工程以及选择了“每个对象对应一个线程”(或者线程缓冲区数目多于一个)的 ActiveX Exe 工程,在“工程”菜单上的“添加 MDIForm”将是不可用的。如果在包含 MDI 窗体的工程中把线程模式改成“单元线程”,则会出现错误。
  • 除了性能比较差以外,单线程的 ActiveX 控件会在多线程的客户应用程序中导致很多问题。因此Visual Basic 禁止在线程模式被设置成“单元线程”的工程中使用单线程控件。详细信息请参阅下面的“将现有的工程转换为单元模式线程化的工程”。
  • 友元属性和方法只能由同一个线程上的对象调用。因为它们不是对象公有接口的一部分,因此无法在线程之间进行调度。
  • 在 ActiveX Exe 工程中的 ActiveX 文档对于单元模型不是线程安全的,除非选择了“每个对象对应一个线程”或者缓冲区数目多于一个的“线程缓冲池”选项。
  • 如果线程显示了一个具有 vbModal 属性的窗体,那么该窗体将只对该线程上的代码和窗体是模态的。在其它线程中运行的代码将不会被阻塞,且由其它线程显示的窗体也将保持是活动的。
  • 在窗体和控件之间的拖放操作只有在拖放源和拖放目标处于同一线程中时才有效。(不过,OLE 的拖放是通用的。)
  • 窗体之间的 DDE 只有在窗体处于同一线程中时才有效

 

 


 

13.要使 ActiveX DLL 工程成为多线程的,应在“工程属性”对话框的“通用”选项卡中选定“请求线程”选项。进程内部件使用的线程只能是客户端用来创建对象和调用对象方法的线程。在进程内部件之内不能创建额外的线程,因此,对 DLL 工程其它线程选项都是不可用的。
14.因为 Visual Basic 为每个单元复制全局数据,因此每个线程都有独立的 Form1。为了避免混淆,可以通过显式地声明自己的窗体变量可以避免在单元线程化的部件中使用预先声明的标识号。
15.当客户端请求对象时,Visual Basic 使用在线程池的下一个线程上创建所需的对象。当线程到达线程池的尾端时,就从头开始。
16.循环线程池模型的一个重要问题:不可能预言哪些对象将位于同一个线程并因此共享全局数据。不同客户端使用的对象可能会共享全局数据,而同一个客户端使用的对象也可能不能共享全局的数据。
17.作为对这些缺陷的补偿,循环线程池模型的优点是限制了线程的总数。这是个很重要的优点,因为,只有当活跃线程的总数与处理器的个数大致匹配的时候,多处理才会工作在最佳状态。
18.如果使用 New 操作符创建新的对象,或是使用声明为 As New 的变量,那么该兄弟对象将不会在另一个线程上创建。该对象将共享创建它的对象的线程(以及全局数据),如从属对象那样。
19.如果新的对象是用 CreateObject 函数创建,那么它就象客户端请求该对象一样。Visual Basic 将根据线程指定的模型,选择在线程池的下一个线程还是在一个新线程上创建该对象。
20.线程之间的切换花费了更多的处理器时间。
21.在无用户界面执行(就是指没有用户接口)的部件中可以使用多线程,
22.Visual Basic 开发环境只支持一个执行线程。为了调试部件的多线程行为,必须先编译部件,然后运行一个测试应用程序来测试该部件。
23.对进程外部件而言,这意味着既要编译该部件,还需要编译测试程序,然后运行测试程序的多个副本。(也可以通过多个开发环境的实例来运行多个测试程序副本,但这样将无法跟踪进入编译后的部件。)
24.用 New 操作符创建的对象不是在新建的线程中创建。它驻留在执行 New 操作符的同一个线程中。请参阅“设计多线程进程外部件”和“在 Visual Basic 部件中对象创建是如何工作的”。
25.Visual Basic 还提供了另一种多执行线程机制。可以将类的 Instancing 属性设置为 SingleUse,这样类的每个实例都将运行在一个独立的部件实例内。
26.Visual Basic 提供两种机制来实现异步通知:事件和回调方法。

原创粉丝点击