【发布时间】:2012-11-26 03:09:23
【问题描述】:
在这段代码中,正如您在 Connect 上看到的那样,AContext.Data 填充了一些东西
TmyTThreadList = class(TThreadList)
id: integer;
end;
var unique_id:integer;
procedure TfrmTestIdTCPServer.IdTCPServerConnect(AContext: TIdContext);
begin
CS.Enter;
try
inc(unique_id);
finally
CS.Leave;
end;
AContext.Data := myTThreadList.Create;
list := myTThreadList(AContext.Data).LockList;
try
myTThreadList(AContext.Data).id := my_unique_id;
list.Add(myTThreadList(AContext.Data));
finally
myTThreadList(AContext.Data).UnlockList;
end;
end;
然后在断开连接时,编码器在此处检查 Acontext.Data nil
procedure TfrmTestIdTCPServer.IdTCPServerDisconnect(AContext: TIdContext);
var
begin
if AContext.Data <> nil then
begin
问题是,他为什么要检查 nil ?
谢谢。
编辑:
我问这个,因为当我这样做时,我在 onExecute 访问 AContext.Data ,有时(当同时连接许多客户端时) AContext.Data 为空,出现访问冲突。
【问题讨论】:
-
旁白:为简单起见,不需要关键部分。对全局 ID 使用 InterlockedIncrement。
标签: delphi indy delphi-xe3