求救! com的线程问题(100分)

  • 主题发起人 主题发起人 modico
  • 开始时间 开始时间
M

modico

Unregistered / Unconfirmed
GUEST, unregistred user!
我在定义的一个进程外服务器(Multi Instance,Apartment)中有一个函数:
procedure Tss.str(var p: OleVariant);
begin
sleep(5000);
p:='ok';
end
当我用两个进程同时调用该函数时一共用了10秒左右的时间,为什么?
 
其实,对于AutoObject对象工厂,使用的线程模型说的是Multi Instance,但实际上它
还是串行的,只是同时使用一个创建的对象而已,参考下列代码:
unit ComObj;
TAutoObjectFactory, TComObjectFactory,
TComObjectFactory.CreateInstanceLic,
TComObjectFactory.CreateComObject
unit VCLCom;
TComponentFactory
TApartmentThread
只有TComponentFactory产生的才真正是多线程!
 
能否给小生一些更详细的代码或解释?谢谢!
 
以下代码是delphi实现Apartment模型的代码,它真正实现线程,
procedure TApartmentThread.Execute;
var
msg: TMsg;
Unk: IUnknown;
begin
try
CoInitialize(nil);
try
FCreateResult := FFactory.CreateInstanceLic(FUnkOuter, nil, FIID, '', Unk);
FUnkOuter := nil;
FFactory := nil;
if FCreateResult = S_OK then
CoMarshalInterThreadInterfaceInStream(FIID, Unk, IStream(FStream));
ReleaseSemaphore(FSemaphore, 1, nil);
if FCreateResult = S_OK then
while GetMessage(msg, 0, 0, 0)do
begin
DispatchMessage(msg);
Unk._AddRef;
if Unk._Release = 1 then
break;
end;
finally
Unk := nil;
CoUninitialize;
end;
except
{ No exceptions should go unhandled }
end;
end;

以下为Apartment模型的对象创建函数,
function TComponentFactory.CreateInstance(const UnkOuter: IUnknown;
const IID: TGUID;
out Obj): HResult;
stdcall;
begin
if not IsLibrary and (ThreadingModel = tmApartment) then
begin
LockServer(True);
try
with TApartmentThread.Create(Self, UnkOuter, IID)do
begin
if WaitForSingleObject(Semaphore, INFINITE) = WAIT_OBJECT_0 then
begin
Result := CreateResult;
if Result <> S_OK then
Exit;
Result := CoGetInterfaceAndReleaseStream(IStream(ObjStream), IID, Obj);
end else
Result := E_FAIL
end;
finally
LockServer(False);
end;
end else
Result := inherited CreateInstance(UnkOuter, IID, Obj);
end;

它通过建立一个单独的先程来对外提供服务,知道对象被释放,线程才结束运行,
GetMessage 是 不接受其他线程的消息
注意接口在线程间Marshal的代码,CoMarshalInterThreadInterfaceInStream和
CoGetInterfaceAndReleaseStream 函数,前一个函数Marshall一个接口,后一个取得
已经Marshall的接口。

 
多谢大侠:)本来现在100分应现在奉上,不过能否再次指点一下:如何在用ide用
一步步创建一个真正的多线程自动化服务器?____大侠讲的仅仅是线程的原理
还有,在李维的<<分布式系统>>一书中讲,在delphi5中明明讲用我一开始所创建
的服务器的线程模型支持我一开始提问时的两线程同时调用(5秒)
 
delphi的IDE建立的REmoteDataModule支持真正的多线程模型。如果你使用
File|New|ActiveX|Automation Object 建立的COM则一定不是多线程的,但MIDAS服务器
却是。要建立真正的多线程自动化服务器,有两个选择:
1、建立一个RemoteDataMudole,在接口中增加一个函数(此接口一定继承IAppServer),
则该COM可以支持多线程;
2、如果你需要建立一个AutoObject类的COM,则需要
(1)建立COM对象接口Library;
(2) 建立对象工厂,TMyAutoFactory,重载函数 CreateInstance,在此函数中建立先程,
提供COM对象;
(3)在Initialization段中将TAutoObjectFactory替换为TMyAutoFactory;
(4) [:)]当然记住注册!
 
谢谢!有机会小生会在次请教的,可不要烦呦:)
 
顺便问一句
CreateInstance(const UnkOuter: IUnknown;
const IID: TGUID;
out Obj): HResult;
stdcall;
的几个参数如何设置?
[:D][:D][?]
 
后退
顶部