用Delphi编写COM服务器中线程的控制

在Delphi开发工具没落的今天,我仍然觉得作为win32上的快速开发,生产力无出其右,最近实现了一个某SDK的代理程序。
此SDK每进程只能运行一个实例,并只能登录一个帐号。
而系统要求有1000个帐号轮番使用,方案是通过外进程COM服务器包装此SDK。

具体的过程就不多说了,只说说关键部分。
以下一切只以外进程的COM服务器为前提,内进程服务器有不用区别,不能一概而论

当New一个自动化对象后,会在相关单元生成以下初始化代码
initialization
  TAutoObjectFactory.Create(ComServer, TXXXhelper, Class_XXXhelper,
    ciSingleInstance, tmFree);

关键是要对后面两个参数说明一下:
ciInternal       --对象不受外部影响
ciSingleInstance --单实例,每启动一个COM新实例就是一个新进程
ciMultiInstance  --多实例, 启动多个COM实例也只启动一个进程

tmSingle         --单线程, 自动化对象的执行线程是主线程
tmApartment      --公寓线程, 自动化对象的执行线程也是主线程
tmFree           --自由线程,自动化对象的执行线程是新的工作线程
tmBoth           --没研究,效果同上
tmNeutral        --没研究,效果同上

测试代码:
procedure TXXXhelper.Start;
var i: Integer;
begin
  i := GetCurrentThreadId;
  try
    TThread.Synchronize(nil, dmXXXX.Login);
  except
    on E: Exception do
    begin
      E.Message := Format('%s - %d - %d',[E.Message, i, GetCurrentThreadId]);
      raise;
    end;
  end;
end;

procedure TdmXXXX.Login;
begin
    raise Exception.CreateFmt('[%d]TEST!!!!!!', [GetCurrentThreadId]);
end;

客户端:
uses相关TLB.pas

obj := CoXXXhelper.Create();
obj.Start();
//此方法会抛出一个异常,并提示[tid1]TEST!!!!!! - tid2 - tid3

当服务器是ciSingleInstance, tmFree时
tid1 = 自动化服务器进程的主线程id
tid2 = tid3 = 新线程id

当服务器是ciSingleInstance, tmApartment时
tid1 = tid2 = tid3 = 自动化服务器进程的主线程id

你可能感兴趣的:(线程,Delphi,com,休闲,外进程)