Hallo Zusammen,
folgendes Ziel bereitet mir aktuell ein wenig Probleme.
Tcp Indy CommandServer mit mehreren TcpIdClient.
auf dem server wurde folgendes record deklariert.
Delphi-Quellcode:
type
TClient = record
sName: string[50];
Profession : integer;
CurValue: Cardinal;
aContext : TIdContext;
end;
Mit diesem Record habe ich ein array erstellt.
arClients : array of TClient;
Von jedem Client der sich connected wird der Context im Array abgelegt.
Delphi-Quellcode:
procedure TfrmServerMain.TCPIdCmdServerConnect(AContext: TIdContext);
var
iKnownClient : integer;
i: Integer;
begin
iKnownClient := -1;
for i := 0 to High(arClients) do
if arClients[i].aContext.Binding.PeerIP = AContext.Binding.PeerIP then
iKnownClient := i;
if AContext.Connection.Connected and (iKnownClient = -1) then
begin
SetLength(arClients,Length(arClients)+1);
arClients[Length(arClients)-1].sName := '';
arClients[Length(arClients)-1].aContext := AContext;
mmoConClients.Lines.Add(AContext.Binding.IP);
mmoServerMsg.Lines.Add('Client connected: '+AContext.Binding.IP);
end;
FillClientMemo;
end;
Jetzt zu meiner Frage. Jeder Client überträgt im 50-200ms Abstand einen Wert der dann an alle verteilt werden soll.
Aktuelle löse ich es so.
Delphi-Quellcode:
sName := ASender.Params[0];
TryStrToInt(ASender.Params[1],iDpsValue);
for i := 0 to High(arClients) do
if arClients[i].aContext = ASender.Context then
begin
CritSection.Enter;
arClients[i].CurDpsValue := iDpsValue;
CritSection.Leave;
end;
SetLength(arStreamClientdata,Length(arClients));
for i := 0 to High(arClients) do
begin
arStreamClientdata[i].sName := arClients[i].sName;
arStreamClientdata[i].iProfession := arClients[i].Profession;
arStreamClientdata[i].CurDpsValue := arClients[i].CurDpsValue;
end;
ms := TMemoryStream.Create;
Try
for i := 0 to High(arStreamClientdata) do //Schreiben der Elemente aus dem Array in den Stream
ms.Write(arStreamClientdata[i], SizeOf(arStreamClientdata[i]));
ASender.Context.Connection.IOHandler.LargeStream := true;
ASender.Context.Connection.IOHandler.WriteLn('201 Data follows');
ms.Position := 0;
ASender.Context.Connection.IOHandler.Write( ms, 0, True );
Finally
ms.Free;
End;
Mit jedem Clienten wird diese Aufgabe immer langsamer bis es dann bis zu 1sec delay kommt.
Welcher Ansatz ist hier der Richtige? Threaded
Indy wenn ein Cmd ausgeführt wird?
Welche Möglichkeiten gibt es, das im WorstCase, alle Clienten gleichzeitig Daten senden können, ohne einen Delay zu erzeugen ?
Grüße
sOn