中国程序员联盟 正在重新改版中ing 不便之处还请见谅 改版后将内容涉及java delphi .net php
 
  首页 | 数据库开发 | 网络通讯 | 多线程 | 多媒体开发 | 图像处理 | 程序人生 | 系统函数 | 控件开发 | Web服务
 
  当前位置:笨鱼delphi技术网>数据库开发>代码分析>文章内容

delphi COM对象选择服务器模式的全面描述

来源:网络 关于:轶名 发布时间:2007-07-02   [收藏] [推荐]
COM 使用与Win32同样的线程机制。它使用Win32 API来创建和同步线程。但线程模型在Win32和COM中是不尽相同的。

Win32线程模型
    Win32 定义了两类线程。用户界面线程和工作者线程。Win32中的每个进程都可以拥有一个或多个用户界面线程和/或多个工作者线程。用户界面线程有消息循环,接受发送到窗口的消息,因此也和一个或多个窗口有关联。工作者线程用于后台处理,不与任何窗口相关联。作为开发者,使用Win32线程时,要注意另外一个主要的不同点。用户界面线程总是拥有一个或多个窗口。当有消息传递给特定的窗口时,用户界面线程负责调用合适的方法。消息循环在同一个用户界面线程中执行,而不理会是哪一个线程发来的消息,所以Windows可以保证同步的正确执行。编程人员不需要为线程同步写附加的特殊代码。然而,如果你开发工作者线程的话,就必须自己处理线程同步,防止死锁或非同步的情况出现。


COM线程模型
    在COM中,线程的含义有些微差异。总共有三类COM线程模型。即:Apartment,Free和Rental线程(为MTS引入)。与Win32最类似的是用户界面线程相当于Apartment线程模型,而工作者线程相当于Free线程模型。

Apartment 线程模型(单线程Apartment)
    此类线程模型在Windows NT3.51和稍后的Windows 95中作为COM的第一个版本引入。Apartment线程模型由一个多线程进程组成,其中每一线程只包括一个COM对象。单线程Apartment(STA)——也表示每个线程只能被一个Apartment调用,每个Apartment都是单线程的。所有的调用都通过Win32消息机制实现。COM保证这些调用的同步。每个线程都有自己的Apartment或者执行关系,在任一时刻只能有一个线程访问这个Apartment。Apartment中的线程只接受来自同一Apartment中其它线程的调用。调用参数需经过Apartment之间的Marshall处理。COM负责在Windows消息机制中处理Apartment间的Marshall过程。

Free线程模型(多线程Apartment)
    此类模型由Windows NT4.0和Windows 95 DCOM引入,允许多个线程访问单个COM对象。使用Free线程的COM对象必须保证线程同步并且实现线程敏感的消息句柄,保证线程安全。调用不能通过Win32消息机制实现,也不能由COM来同步线程,因为同一方法可能在同一时间被多个进程访问。使用Free线程的对象应该能随时处理来自其它线程的方法调用,以及处理来自多线程的同时调用。参数直接传递到任意线程,因为所有的Free线程在同一Apartment中存在。这也称之为多线程Apartment(MTA)。

Apartment和Free线程模型并存
  一个进程可能同时拥有Apartment和Free线程模型。唯一的限制是只可同时拥有一个Free线程模型,但可以有多个单线程Apartment。Apartment之间的指针和数据传递需经过Marshall处理。调用STA中的对象方法将由Win32保证同步,调用MTA中的对象方法则完全不经过同步处理。

Thread Neutral Apartment模型
    使用Thread Neutral Apartment(TNA)的组件将自己标记为Free或Both模型。这里组件的实例配合调用者线程而使用调用者线程的模型。COM类对象的实例能在每次被调用时使用不通的线程模型。当线程执行COM对象中的方法,且此方法创建一个新对象时,MTS将暂停当前线程,创建一个新线程来负责对创建对象的处理。和MTA一样,TNA允许多个线程进入一个Apartment。但是,每当一个线程进入Apartment时,将锁定进入的Apartment,仅当退出时才允许其它线程进入。此类线程模型被引进MTS和COM+的原因是保证上下文切换速度

[浏览: 次]   
上一篇:delphi 产生不重复的随机数   下一篇:delphi 将Datasets的数据DCOM方式传递
[收藏] [推荐] [返回顶部] [打印本页] [关闭窗口]  
    评论加载中…
google adsense热点文章
·delphi Delphi_动态数组介绍----Delphi
·delphi 检查IP地址
·delphi DBExpress 提高
·delphi 复制Excel列到二维数组
·delphi Delphi_VCL消息处理机制的内幕
·delphi 产生不重复的随机数
·delphi 如何在DELPHI里调用MS office
·delphi 缓冲池
·delphi MIDAS——多层分布式应用程序服
·delphi 在WORD文档里添加页签
·delphi Asta多层应用实现
·delphi Datamodule的应用方式
     delphi技术网 | firefox 下载 | Avant Browser下载 | dedecms 技术网 | drupal 爱好者 | php 技术网
  Copyright@www.delphichm.com,2006-2009.All Rights Reserved.
 
程序员联盟 | delphi Java .net|QQ:707102932