各位高手来讲一讲:single-threaded process 
apartment model process 
free-threaded process 
mixed model process 
multithreaded apartment model 
neutral apartment model

解决方案 »

  1.   

    UP,com的套间的概念,看了几本经典的书,还是没有掌握好,关注
      

  2.   

    我就我的理解说一点(个人理解):线程
    单线程和多线程之分。套间
    multi-apartment and single-apartment套间在线程和进程之间,简单的说就是:
    class 套间 :public 进程,public 线程
    multi-apartment里可以多个线程或一个线程.
    single-apartment里可以多个线程或一个线程,too.
    而single-apartment和multi-apartment主要是对用户访问COM而分的!
    CSDN是有两篇文章你可以看一看<COM组件的多线程测试-Apartment模型><COM组件的多线程测试-Single模型>
      

  3.   

    组件是以套间为概念的,组件只能存在与套间之中,没当我们coninitialize()一次,就生成了一个套间, 在这个套间中,你可以用cocreateinstace等COM函数创建组件!至于多线程只是说明这个套间能否被多个现成同时访问,跨套间访问是要调用代理/存根的!
      

  4.   

    线程模型实在有些困扰我。
    先谈服务器端:
    如果是进程内组件,那么有指定的线程模型,apartment,free,both,single。
    如果是进程外组件,那么没有指定的线程模型,线程模型由Coninitialize调用直接确定的。
    再看客户端:
    if(  调用进程内组件) then
    {
      
      
       1,Coinnitialize(null,线程模型)表示客户线程要进入指定模型的套间。
           //###################
          if (线程模型=free 并且 进程中free 套间已经存在) then
          {
            客户线程就直接进入free套间
          }
          else if(线程模型=free 并且 进程中free 套间不存在)
          {
           客户线程创建free套间
           客户线程进入free套间
          }
          //###################
          if (线程模型=apartment 并且 客户线程已经创建过apartment 套间) then
          {
            客户线程可以直接进入该apartment套间或者创建新apartment 套间
            
          }
           else if(线程模型=apartment 并且 客户线程还没创建apartment 套间)
          {
           客户线程创建apartment套间
           客户线程进入apartment套间
          }
           //###################
       2, createinstance
          有的文档说Coinnitialize(null,线程模型)初始化com库,它指定的线程模型是指客户线程会
           进入一个相应的套间,客户线程create出的instance都是在这个套间中。
          但是如果客户线程在free套间中,而组件的线程模型是apartement。那么createinstance会把组件放在哪个套间呢?
          是不是客户线程会生成一个新线程A或使用其他已经进入apartment套间的线程B,由这个线程a或线程B去create这个组件。
           最后客户得到组件的代理指针????
           //###################
       3,列集的问题
          是否跨套间访问都需要列集???
          《com原理与应用》134页上举了列集的几种情况,其中:组件在free套间中,客户在apartment套间时,这样的调用
          不需要列集。原因是这种情况下,com做了优化。客户可以得到对象指针。
    }if( 调用进程外组件) then
    {
      1,Coinnitialize(null,线程模型)表示客户线程要进入指定模型的套间。
         有的文档说进程外组件的线程模型是由Coninitialize调用直接确定的。
         那么也就是说客户线程和组件处于同一个套间中。
         可是这有什么意义??因为列集还是需要的。
         ????对进程外组件,套间是没有意义的????? 
      2 列集
      由于client,server处于不同的进程。肯定需要列集。
    }
      

  5.   

    1. 如同CPU存在一个当前运行环境(也称上下文,通常包括堆栈、机器状态等信息)一样,每个线程也必然存在一个COM运行环境,这就是套间。
    2. 每段CPU指令必须运行在某个(些)运行环境中,比如进程调度只能在进程上下文中进行。相应的,每个COM对象只能运行在某个(些)套间中(即只能由此套间过程调用其方法,跨套间调用采用的是代理,实际调用仍然发生在COM对象所处的套间)。
      

  6.   

    如果你能理解DC(Device Context),那套间就很容易了
    当你的程序中要使用多个全局变量时,一般应该生成一个struct,将那些全局包装起来,一般将这个struct的一个实例称做一个环境,如事务环境、COM+中的各种环境。这些环境用于由你的客户告诉你的程序怎样服务于你的客户。在COM+中,程序就是COM+运行时期库,而客户就是你的COM+组件
    套间就是一个环境,里面的成员变量记录着你的COM组件希望COM运行时期库提供的服务(应该注意,套间只是COM运行库提供的纵多个环境中的一个,主要提供同步服务)因此,只要一个COM组件运行,就要以COM运行时期库为服务器,因此就必须有一个套间以表明其需要的服务。Single、Apartment、Free、Both、NA都只是进程内组件告诉COM运行库它需要的安全服务种类,COM运行库会自动根据此信息将一个套间和你的COM组件绑定。
    套间总共只有三种,既MTA、STA和NA,因此可以认为套间这个环境只有一个成员变量,而其取值只有三个。(实际当然不止,如至少还要有一组变量记录线程相关的信息)STA表明COM运行库会截获每一个对你的组件的调用(通过代理实现的)
    MTA则不截获任何调用,但你自己处理同步问题
    NA(Win2000以上的COM运行库才具有)则仍会截获,但其代理是轻量级的,实现为进程内组件时要和Free的实现要求一样(只能为进程内组件)
      

  7.   

    single-threaded apartment - STA, 只有一个线程
    multithreaded apartment   - MTA, 有一个或者多个线程
    single-threaded process - 进程内只有一个STA,没有MTA
    apartment model process - 进程内有>=2个STA,没有MTA
    free-threaded process   - 进程内只有一个MTA,没有STA
    mixed model process     - 进程中只有一个MTA和>=1个STA
    multithreaded apartment model - 所有的线程只存在于一个apartment中,即一个MTA中
    neutral apartment model       - 可以包含所有类型的线程. COM的推荐.