delphi 如何在ISAPI中获取全局变量的实际值?

yks3o0rb  于 2023-05-06  发布在  其他
关注(0)|答案(1)|浏览(146)

我想用 Delphi (10.4)WebBroker为Apache创建ISAPI dll。它工作正常。然后我想添加一些会话监视器:这个想法是在WebModule上添加idTCPServer,并通过它获得一些包含所有当前“会话”的全局变量。出于测试的原因,我在每个请求webmodule的默认处理程序动作中使用无限循环“while true”。在循环之前,我还将值添加到全局变量DictRequests:Tdictionary〈Tguid,string〉。所以问题是,当我做,例如,5个请求无限循环,并试图通过TCP DictRequests.计数我只得到1个请求和其他四个只有约20秒后。我想问题出在isapi的线程示例中,也许你可以给予一些建议如何获得全局变量的实际值?

type
  TWebModule2 = class(TWebModule)
    IdTCPServer1: TIdTCPServer;
    procedure WebModule2DefaultHandlerAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    procedure IdTCPServer1Execute(AContext: TIdContext);
  end;

var
  WebModuleClass: TComponentClass = TWebModule2;
  DictRequests: Tdictionary<Tguid, TRequest>;

implementation

procedure TWebModule2.IdTCPServer1Execute(AContext: TIdContext);
var
  Item: TPair<TGuid, TRequest>;
  DictContent: String;
begin
  AContext.Connection.IOHandler.readln;
  AContext.Connection.IOHandler.writeln(
          DateTimeToStr(now) +
          #13#10 +
          'DictGUid.Count: ' + #9 + inttostr(DictRequests.Count));

procedure TWebModule2.WebModule2DefaultHandlerAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  guid: Tguid;
begin

  guid := TGUID.NewGuid;

  DictRequests.Add(guid, 'some kind of data');

  while True do
  begin
  end;

  Response.Content :=
              '<html>' +
              '<head><title>2_Web Server Application</title></head>' +
              '<body>' DATETIME = ' + DateTimeToStr(now) + '</body>' +
              '</html>';
end;

initialization
  DictRequests := TDictionary<Tguid, TRequest>.Create;

我从tcp得到的:03.05.2023 9:12:27 DictGUid。计数:1 03.05.2023 9:12:41 DictGUid。计数:3 03.05.2023 9:12:41 DictGUid。计数:5
如果我删除while-true,它会像预期的那样工作。

2guxujil

2guxujil1#

如果你写

while true do
begin
end;

在任何地方,它都将无限期地锁定执行线程。在它之后的任何代码都可能不会被执行。
我建议用TIdTCPServer组件(通常是一个单独的exe文件或NT服务)启动一个单独的 Delphi 项目,并使用TIdTCPClient组件从每个TWebModule2.WebModule2DefaultHandlerAction连接到该服务器,以读取服务器存储和管理的数据。

相关问题