自由线程封送拆收器什么意思?//两个线程处理模型是俩个线程之间吗?该怎么解决

自由线程封送拆收器什么意思?//两个线程处理模型是俩个线程之间吗?

ATL简单对象向导的属性页选择自由线程封送拆收器(FTM)选项卡。 

向导在 FinalConstruct 在 FinalRelease生成代码创建的自由线程封送拆收器的实例和释放该实例。 COM_INTERFACE_ENTRY_AGGREGATE 宏自动添加到COM映射确保 QueryInterface 请求 IMarshal 由自由线程的封送拆收器。 

自由线程封送拆收器允许直接访问在对象的接口从在同一的所有线程处理,加速跨单元调用。 此选项适用于使用两个线程处理模型的选件类使用。 

在使用此选项时,选件类都必须对其数据线程安全的责任。 此外,复合自由线程封送拆收器和需要使用其他对象获取的接口指针的对象必须执行附加步骤以确保接口正确封送。 通常,每次使用,则与存储接口指针在全局接口表(GIT)中并获取指针从GIT它。 ATL提供选件类 CComGITPtr 帮助您在GIT存储的接口指针


------解决方案--------------------
楼主把英文原版贴出来吧,这种机器翻译的东西比英文还难懂
------解决方案--------------------
在ATL Internal.chapter6.aggregation一节有解释,原文不贴出来了
简单的说,跨套间调用对象要使用proxy-stub方法,其本质是调用IMarshal接口(底层RPC进程间通讯)。
在同一dll模块里,调用RPC的开销很高,而FTM实现了一种快速IMarshal接口(等于作弊),如果你的对象内聚了这个FTM也就暴露了IMarshal接口,所以跨套间访问你的对象也就更加高效。

内聚了FTM的对象就成了Apartment-neutral object,访问它将非常快速

不过使用FTM的对象有一些限制
1.你的对象必须是线程安全的,就是说所有的接口实现必须加锁,即使你的ThreadingModel=Apartment
2.你的对象不可以在被其他对象内聚,就是说non-aggregatable
3.你的对象不可以在结构中储存接口指针[CComPtr之类],而应该储存cookie,使用时用CComGITPtr

反正如果你对性能要求不高的情况,还是不用为妙。