VFP开发Dcom程序的注意事项

控制调用阻塞

为了提高您的应用程序的分时性,Visual FoxPro 提供 SingleUse 对象和套件模型线程作为对调用阻塞问题的控制。

SingleUse 对象

通过在“项目信息”对话框(自 Visual FoxPro 5.0 起可用)中把 OLEPUBLIC 类的实例属性设置为 SingleUse,您能使该类的每个实例在组件的独立实例中运行。这意味着即使您的组件是单线程的,SingleUse 类的每个实例也有它自己的运行线程。在EXE 服务程序和DLL 服务程序中,SingleUse 对象的行为是不同的。

EXE 服务程序中的 SingleUse 对象

随着设置实例属性为 SingleUse,每个实例都导致一个新的 .exe 进程开始运行(在 Windows NT 环境下,您将在“任务管理器”中看到每个在运行的线程)。随着设置实例属性为 MultiUse,第一个实例将导致一个新的进程开始运行,但每个新的对象实例将和第一个实例共享同一线程。

DLL 服务程序中的 SingleUse 对象

实例属性仅在 Vfp6r.dll 运行时刻被读出,但是对于多线程 .dll是被忽略的。为和 Vfp6t.dll 运行时刻库一起使用而连编的服务程序,不管它们的设置是什么,总是 MultiUse 的。总之,对于 Vfp6r.dll 进程内服务程序,您应把实例属性设置为 MultiUse。如果您把它设成 SingleUse,那么只能创建该服务程序中的对象的一个实例。如果您试图实例化更多的对象,将出现错误。只在极少数情况下,您需要使用 SingleUse 设置。实际上,Microsoft Transaction Server 组件要求 MultiUse 设置。SingleUse 对象经常比多线程组件中的多对象需要占用更多的内存。

然而,也存在使用SingleUse 对象的情况。例如,使用 SingleUse 对象,您可以把高风险的活动隔离在独立的进程中。如果对象发生致命错误,其他进程不会受到影响。相反,在多线程组件中发生的致命错误将终止所有线程。

套件模型线程

现在,Visual FoxPro Automation 服务程序支持套件模型线程。Microsoft Transaction Server 使用标记为线程化套件的服务程序,并通过串行和编组提供更好的线程保护和分时性。

在 Visual FoxPro 6 SP3 中,套件模型线程提供线程安全。在套件模型线程中,每个线程就象一个套件,所有在该线程上创建的对象位于该套件内,它们不知道在其他套件中的对象。每个套件模型对象(例如 Visual FoxPro Automation 服务程序)只能由一个线程重入,即创建该对象的线程。然而,对象服务程序(例如 Microsoft Transaction Server)能够支持多对象,每个对象从不同的线程同时重入。对象服务程序保留的公共数据必须受到保护以免受线程冲突影响。

套件模型线程具有以下优点:

  • 客户应用程序在一个给定线程上创建的所有对象都是在 DLL 的同一套件(线程)里创建的。在同一线程上对这些对象的调用不需要交叉线程排列,从而使它们更加有效。

  • 因为一个对象只能在创建它的线程上被访问,所以调用被串行排列,使一个调用不会被从其他线程发出的调用中断。

  • 交叉线程调用的参数被编组,发出调用的线程被阻塞。数据同步保护发出调用的线程的状态。

线程化套件 DLL 不能创建它们自己的线程;在客户应用程序线程第一次要求您的 DLL 提供对象时,将创建一个新的套件,并且为该套件运行一个对象 Init 事件。该客户应用程序要求的所有单线程客户应用程序对象将驻留在该套件中,并共享全局数据。由该公共对象创建的任何 PRIVATE 对象(包括表单)也将驻留在该套件中。

虽然 Visual FoxPro 没有提供套件之间互相访问的方法,多线程客户应用程序可以获得对线程 A 上的对象的引用,并将该引用传递到线程 B 上的对象。有关套件模型线程的更多信息,请查阅 MSDN 库中的“套件模型线程”。

Visual FoxPro 执行套件模型线程,通过给予每个套件它自己的全局数据副本,消除了从多线程访问全局数据的冲突。这意味着所有在该线程上创建的对象都在该套件内存在,它们不知道在其他套件中的对象,如下图所示。

Visual FoxPro 使用线程本地存储,为每个线程(套件)存储一套唯一的应用程序和环境全局数据。这意味着同一个类在不同的线程上创建的两个实例不能互相访问数据。这就是说,如果这两个实例驻留在同一线程上,那么每个对象都可以访问另一个对象的数据。这可能给您的应用程序带来定时问题。实际上,只要在同一线程上的两个对象是从同一 .dll 服务程序中的 OLEPUBLIC 类创建的,那么从那些对象来的数据在它们之间是共用的。

注意 您可以使用 Session 类给每个对象一个唯一的私有数据工作期。

除了线程本地存储之外,Visual FoxPro 也给每个项目 (.dll) 提供一套唯一的全局数据。从不同线程创建的对象(.dll 服务程序)不能互相访问其他项目的全局数据,即使两个对象驻留在同一的线程上。

你可能感兴趣的:(com)