关于李维的COM/DCOM的线程模型(200分)

  • 主题发起人 主题发起人 zqnet
  • 开始时间 开始时间
李维的系统篇第六章开始例子讲服务器不能为客户端建立多个服务线程.
 
问题是?
 
他的意思是 D4的Remote DataModule 和 AutoObject 会产生阻塞,
而 Delphi 5 的 Remote DataModule 支持Apartment线程得VERY GOOD了。
 
D5中的RDM支持Apratment,但是必须为每一个客户建立一个Apartment才可以不互相影响。
因为每一个Apartment中只有一个线程可以使用。
 
我的问题是.我做了个例子,起了三个客户端,用DCOM控件 连接,用IAPPSEVER接口调用.
服务器能够产生三个线程
 
并未编什么
代码,可看李维的例子说不行.为何?
怎么为每个客户建一个Apartment,我的客户端同时
对一个RDM中的同一个数据集控件操作
 
李维是说一个客户端要用多线程连接中间层才不会产生吧?
 
真的看不太懂,你大学语文课是不是经常逃课。
 
来听大虾讲课。
 
服务端的COM如果是STA(Apartment Thread): 一个STA里只能有一个线程。
客户端如果这样调用服务端的COM,“就不能”建立多个服务线程:
begin
CoInitialize // 进入Apartment
|---------------线程1-----------------| |----------------线程2----------------|
|CoCreateInstance // 生成COM对象1 | |CoCreateInstance // 生成COM对象2 |
|-------------------------------------| |-------------------------------------|
CoUnintialize // 退出Apartment
end;

////////////////////////////////////////////////////////////////////////////////////
客户端如果这样调用服务端的COM,“就可以”建立多个服务线程:
begin
|---------------线程1-----------------| |----------------线程2----------------|
|CoInitialize // 进入Apartment | |CoInitialize // 进入Apartment |
|CoCreateInstance // 生成COM对象1 | |CoCreateInstance // 生成COM对象2 |
|CoUnintialize // 退出Apartment | |CoUnintialize // 退出Apartment |
|-------------------------------------| |-------------------------------------|
end;
 
op的图画的真好。佩服佩服。
总之,每个Apartment中只有一个线程。
zqnet,你到底是什么意思?搞的我们都不懂你在说什么?
 
多人接受答案了。
 
我好象明白了,李维是说一个客户端如果是多线程需要编程,是么?
 
1.有问题:
例如Nt Server4上我创建了Apartment 的AutomationObject为a,有一个接口为Ia,
客户端也在这台NT Server4上,客户端这样写对不对:
var aa:Ia;
begin
CoInitializeEx(Nil,COINIT_MULTITHREADED);
Status := CoCreateInstance(IID_I{或CLASS_a}, nil, CLSCTX_LOCAL_SERVER, IUnknown, Result);
//CoCreateInstance调用成功,Result有值
aa:=Coa.Create;
aa.test;
{test方法中做Sleep(10000);}
CoUnInitialize;
//但这样调用后,一个客户端必须等上一个客户端调用完test方法后才能调用test方法,并不能实现并发,为什么?
//如果谁有成功的例子,能否发一个给我?谢谢!

2.a是由如下语句创建的:
TAutoObjectFactory.Create(ComServer, Ta, Class_a,
ciMultiInstance, tmApartment);
而TAutoObjectFactory由ComObj.pas定义,ComObj.pas中并没有对Apartment 的
AutomationObject做CoMarshalInterThreadInterfaceInStream,因此我觉得Apartment
的AutomationObject根本不可能支持两个客户端并发调用,大家认为呢?

 
delphi 中的apartment 其实只是只能建立一个主STA,这是有服务器端的类厂决定的。
李为在书中指出过,TcomponentobjectFactory 才真正实现了STA,你可以把服务器端的
TAutoObjectFactory.create 该为TcomponentObjectFactory.create;同时把对象的父类
由原来的Tautoobject,改为TComponent(否则编译通不过,类型不匹配)。.

一切OK!!!多客户并发执行!!决不会出现排队。
 
后退
顶部