我在爲每個IdTCPServer連接聲明一個唯一的全局變量時遇到問題。我想在這裏做的是。Delphi:每個TIdcontext的唯一變量
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;
錯誤occures時GetMem函數被調用idtcpconnect,我覺得我做的一切都是錯的,我不知道我怎麼可以有一個獨特的全局變量爲每個上下文。
在連接回調中,實際上是AContext類型的TMyContext嗎?如果沒有,它將不會爲你的FPacketBuffer字段分配空間,這會炸掉。 –
TMyContext是一類tidservercontext –
是的,我可以看到,但是當MainSckConnect被調用時,它已被預先攔截,以便分配TMyConnect而不是常規的TIdContext。投射到TMyConnect不會奇蹟般地改變類型 - 它只是告訴編譯器假定它是一個TMyConnect實例。 –