在Delphi开发工具没落的今天,我仍然觉得作为win32上的快速开发,生产力无出其右,最近实现了一个某SDK的代理程序。
此SDK每进程只能运行一个实例,并只能登录一个帐号。
而系统要求有1000个帐号轮番使用,方案是通过外进程COM服务器包装此SDK。
具体的过程就不多说了,只说说关键部分。
以下一切只以外进程的COM服务器为前提,内进程服务器有不用区别,不能一概而论
当New一个自动化对象后,会在相关单元生成以下初始化代码
关键是要对后面两个参数说明一下:
ciInternal --对象不受外部影响
ciSingleInstance --单实例,每启动一个COM新实例就是一个新进程
ciMultiInstance --多实例, 启动多个COM实例也只启动一个进程
tmSingle --单线程, 自动化对象的执行线程是主线程
tmApartment --公寓线程, 自动化对象的执行线程也是主线程
tmFree --自由线程,自动化对象的执行线程是新的工作线程
tmBoth --没研究,效果同上
tmNeutral --没研究,效果同上
测试代码:
客户端:
当服务器是ciSingleInstance, tmFree时
tid1 = 自动化服务器进程的主线程id
tid2 = tid3 = 新线程id
当服务器是ciSingleInstance, tmApartment时
tid1 = tid2 = tid3 = 自动化服务器进程的主线程id
此SDK每进程只能运行一个实例,并只能登录一个帐号。
而系统要求有1000个帐号轮番使用,方案是通过外进程COM服务器包装此SDK。
具体的过程就不多说了,只说说关键部分。
以下一切只以外进程的COM服务器为前提,内进程服务器有不用区别,不能一概而论
当New一个自动化对象后,会在相关单元生成以下初始化代码
initialization
TAutoObjectFactory.Create(ComServer, TXXXhelper, Class_XXXhelper,
ciSingleInstance, tmFree);
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;
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
obj := CoXXXhelper.Create();
obj.Start();
//此方法会抛出一个异常,并提示[tid1]TEST!!!!!! - tid2 - tid3
当服务器是ciSingleInstance, tmFree时
tid1 = 自动化服务器进程的主线程id
tid2 = tid3 = 新线程id
当服务器是ciSingleInstance, tmApartment时
tid1 = tid2 = tid3 = 自动化服务器进程的主线程id
转载于:https://blog.51cto.com/salomi/162859