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时会发生错误,我想我做错了,我不知道如何为每个上下文创建一个唯一的全局变量.
TIdTCPServer.ContextClass在运行时激活服务器之前,请确保将类类型分配给属性,例如:
procedure TMainFrm.FormCreate(Sender: TObject);
begin
MainSck.ContextClass := TMyContext;
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1575 次 |
| 最近记录: |