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 が呼び出されるとエラーが発生します。すべて間違っていると思います。コンテキストごとに一意のグローバル変数を設定する方法がわかりません。