繁体   English   中英

Delphi COM服务器一次处理一个请求

[英]Delphi COM server processes one request at a time

我有一个进程外COM服务器,最初是在Delphi 7中开发的,然后是D2006,最近在XE3下重新编译了。 在XE3版本下,一次处理一个请求。 如果一个进程正在进行而另一个进程进入,则ObjectCount会增加,但是第二个进程直到第一个进程完成时才会处理。 D7 / D2006版本同时处理请求。

服务器维护一个数据库。 大多数请求处理速度非常快,但有些请求则需要一分钟或更长时间。 有一个带有备注的表单,其中显示了活动日志,即整个UI。 不知道还有哪些其他信息会有所帮助。

为什么XE3版本的行为会有所不同? 或者,通常,为什么第二个服务器对象可能要等第一个服务器对象完成?

这是一个例子。 我安装了XE5,创建了VCL应用程序,并使用一种方法添加了COM对象,并创建了测试客户端。 它一次处理一个请求。 我在D2006中编译了相同的项目(只需要删除单元前缀),然后就可以同时处理它们。

我究竟做错了什么?

unit Unit2;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  Windows, ActiveX, Classes, ComObj, Project1_TLB, StdVcl;

type
  TTest = class(TTypedComObject, ITest)
  protected
    function Method1(N: Integer): HResult; stdcall;
  end;

implementation

uses ComServ;

function TTest.Method1(N: Integer): HResult;
var I: Integer;
begin
for I := 1 to N do
  Sleep( 1000);
end;

initialization
  TTypedComObjectFactory.Create(ComServer, TTest, Class_Test,
    ciMultiInstance, tmFree);
end.

仔细检查每个版本的COM对象的线程模型。 听起来XE3版本是单元线程的(COM将请求序列化),而早期版本是多线程/自由线程的(COM不对请求进行序列化)。

我通过上面的简单Delphi XE5服务器进行了跟踪。 Application.Initialize-> ComServ.InitComServer-> ComObj.InitComObj-> CoInitializeEx(nil,COINIT_MULTITHREADED),它将返回RPC_E_CHANGED_MODE。 服务器一次处理一个请求。

跟踪在D2006下编译的同一项目时,CoInitializeEx调用返回S_OK,并且服务器同时处理请求。

我在调用Application.Initialize之前在项目源代码中添加了对CoUninitialize的调用。 这样,XE5版本会同时处理请求。 这也适用于提示问题的生产服务器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM