I use the critsections in the other threads that uses "Client", for instance the thread that sends packets that are in the outgoing que:
[pascal]
procedure TConnectionthread.SendPacket(Packet: TPacket);
begin
Crit.Acquire;
try
if (Client = nil) then Exit;

if Client.Connected then
begin
Client.IOHandler.WriteLn(Packet.OpCode[0]+Packet.OpCode[1]+Packet.Data);
end
else
begin
Controller.SocketStatus:= 'Not Connected!';
Client.Connect;
end;
finally
Crit.Release;
end;
end;
[/pascal]

i tried putting critsections in the listeningthread too, but it made no difference... :/