delphi5的ApartmentCOM不支持多Client同时访问?(50分)

  • 主题发起人 主题发起人 zhfhe
  • 开始时间 开始时间
Z

zhfhe

Unregistered / Unconfirmed
GUEST, unregistred user!
刚刚按李维书上做了一个ApartmentCOM,提供test方法,该方法调用sleep(10000),奇怪的是如果两个Client端同时调用test方法,则要20秒以后第二个Client端才得到返回,这是为什么?
//Server-------------
uses ComServ;
procedure Ttest.test;
begin
Sleep(10000);
end;
initialization
TAutoObjectFactory.Create(ComServer, Ttest, Class_test,
ciMultiInstance, tmApartment);
end.
//Client-------------
var
Form1: TForm1;
myt:Itest;
FStream:IStream;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
CoInitializeEx(Nil,COINIT_APARTMENTTHREADED);
//换成COINIT_MULTITHREADED或CoInitialize(nil)结果也是一样
myt:=Cotest.Create;
//加不加下面Marshal结果都一样!
CoMarshalInterThreadInterfaceInStream(IID_Itest , myt ,FStream);
myt.test;
end;
 
D4本来就不支持Apartment,Free.
 
每一个ApartmentCOM在同一时间,只能处理一个请求.
 
接受答案了.
 
1,Delphi4/5的COM类实现都是线程安全的,支持COM的所有线程模式。
2,Apartment线程模式实际上是STA(Single-threaded Apartment),
它通过隐藏的窗口的消息循环将对组件的*接口方法调用*同步。
3,你调用STA组件某一接口的同一方法,因此势必被同步。
4,实际上对于你的测试方法完全可以用Free线程模式(即MTA)
 
我从网上下了一个包,可以实现在Apartment线程两个Client端同时并发调用test方法而不被同步.
但心里总是不放心这个包是否有其他问题,毕竟不是Inprise写的,为什么不用
Free:因为我有大量的局部变量,采取Free后需要大量的临界区加锁语句来
保护局部变量,但根据实际经验,使用临界区后Server很容易死掉。
 
后退
顶部