我在为 IdTCPServer 的每个连接声明一个唯一的全局变量时遇到问题。我在这里要做的是。
TMyContext = class(TIdServerContext)
public
Tag: Integer;
Queue: TIdThreadSafeList;
FPacketBuffer: Pointer;
PacketBufferPtr: Integer;
constructor Create(AConnection: TIdTCPConnection; AYarn: TIdYarn; AList: TThreadList = nil); override;
destructor Destroy; override;
end;
然后使用 TMyContext(AContext).FPacketBuffer 访问变量,但是当连接处于活动状态并且新连接尝试连接时出现访问冲突错误。这是我的 idTcpConnect 和 idTcpDisconnect 中的内容
procedure TMainFrm.MainSckConnect(AContext: TIdContext);
begin
TMyContext(AContext).Queue.Clear;
TMyContext(AContext).Tag := -1;
GetMem(TMyContext(AContext).FPacketBuffer,65536);
end;
procedure TMainFrm.MainSckDisconnect(AContext: TIdContext);
Var Client: TClientInfo;
begin
//If TMyContext(AContext).Queue.Count > 0 Then TMyContext(AContext).Queue.Clear;
TMyContext(AContext).Queue.Clear;
FreeMem(TMyContext(AContext).FPacketBuffer);
If AContext.Data <> nil Then Begin
Client := Pointer(AContext.Data);
Clients.Remove(Client);
Client.Free;
AContext.Data := nil;
End;
end;
在 idtcpconnect 中调用 getmem 时会发生错误,我认为我做错了,我不确定如何为每个上下文设置一个唯一的全局变量。