Delphi:每个TIdcontext的唯一变量

Jun*_*oor 2 delphi variables indy10

我遇到了为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;
Run Code Online (Sandbox Code Playgroud)

然后使用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;
Run Code Online (Sandbox Code Playgroud)

在idtcpconnect中调用getmem时会发生错误,我想我做错了,我不知道如何为每个上下文创建一个唯一的全局变量.

Rem*_*eau 5

TIdTCPServer.ContextClass在运行时激活服务器之前,请确保将类类型分配给属性,例如:

procedure TMainFrm.FormCreate(Sender: TObject);
begin
  MainSck.ContextClass := TMyContext;
end;
Run Code Online (Sandbox Code Playgroud)

  • 我向你保证,每个`TIdContext`对象都是唯一的,因此它的数据成员对每个连接的客户端都是唯一的.因此,在您尚未显示的代码中,其他内容可能会出错,而您的客户端代码只是环境的受害者.例如,如果您的`Clients`列表不是线程安全的并且正在破坏内存. (2认同)