我想用 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,它会像预期的那样工作。
1条答案
按热度按时间2guxujil1#
如果你写
在任何地方,它都将无限期地锁定执行线程。在它之后的任何代码都可能不会被执行。
我建议用
TIdTCPServer
组件(通常是一个单独的exe文件或NT服务)启动一个单独的 Delphi 项目,并使用TIdTCPClient
组件从每个TWebModule2.WebModule2DefaultHandlerAction
连接到该服务器,以读取服务器存储和管理的数据。