各位高手来讲一讲:single-threaded process
apartment model process
free-threaded process
mixed model process
multithreaded apartment model
neutral apartment model
apartment model process
free-threaded process
mixed model process
multithreaded apartment model
neutral apartment model
解决方案 »
- vs2012无法新建项目,是怎么回事啊,什么项目都创建不了,求大神们解决啊!!!!!!
- 帮帮我分析下程序,给点意见,谢谢!
- 帮忙看下一个函数
- 明基 joybook Lite U105可以玩冒险岛吗?
- 如何在应用层解析业务类型 DPI
- VC编译COM组件的奇怪问题,高手帮忙,在线
- 请问如何在ATL的自定义方法中获得鼠标当前的位置
- 我后天就要去托普面试编码人员,面试会做些什么呢?????????
- 求教,我试着用SDK做一个带有菜单的最简单的程序,为何菜单出不来?????
- 请问.pdg文件是什么文件,需要什么浏览器浏览
- 如何将CString转为COleDateTime型?
- 在当前目录的每一个文件夹下查找一指定文件,并替换为当前目录下的另一个文件,
单线程和多线程之分。套间
multi-apartment and single-apartment套间在线程和进程之间,简单的说就是:
class 套间 :public 进程,public 线程
multi-apartment里可以多个线程或一个线程.
single-apartment里可以多个线程或一个线程,too.
而single-apartment和multi-apartment主要是对用户访问COM而分的!
CSDN是有两篇文章你可以看一看<COM组件的多线程测试-Apartment模型><COM组件的多线程测试-Single模型>
先谈服务器端:
如果是进程内组件,那么有指定的线程模型,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处于不同的进程。肯定需要列集。
}
2. 每段CPU指令必须运行在某个(些)运行环境中,比如进程调度只能在进程上下文中进行。相应的,每个COM对象只能运行在某个(些)套间中(即只能由此套间过程调用其方法,跨套间调用采用的是代理,实际调用仍然发生在COM对象所处的套间)。
当你的程序中要使用多个全局变量时,一般应该生成一个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的实现要求一样(只能为进程内组件)
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的推荐.