Oh Mann, da hätte "man" ja auch mal selbst drauf kommen können.
Es ist ja nachvollziehbar, dass der Verbindungsaufbau immer etwas Zeit kostet.
Jetzt übertrage ich die 301 Werte einfach als String-Liste und lese sie en Block wieder aus.
Das funktioniert hier auf dem PC erst mal ohne sichtbare Verzögerung, auch bei mehreren Clients.
Delphi-Quellcode:
// Server:
..
else if (cmd = '?ALL') then
begin
S := IntToStr(T);
for Index := Low(A) to High(A) do
S := S + #13#10 + IntToStr(A[Index]);
SendText(AContext, S);
end
..
// Client:
..
procedure ReadText(FClient: TIdTCPClient; cmd: String; SL: TStringList);
var
MS: TMemoryStream;
I: Int64;
begin
FClient.Connect;
if FClient.Connected then
begin
MS := TMemoryStream.Create;
try
FClient.Socket.WriteLn(cmd);
I := FClient.Socket.ReadInt64;
FClient.Socket.ReadStream(MS, I, false);
MS.Position := 0;
SL.LoadFromStream(MS);
// Result := Copy(SL.Text, 1, Length(SL.Text) - 2); // SL.Text; //
finally
MS.Free;
end;
end;
FClient.Disconnect;
end;
..
ReadText(IdTCPClient1, '?ALL', SL);
T := StrToInt(SL[0]);
Index := 1;
while Index < SL.Count do
begin
A[Index] := StrToInt(SL[Index]);
Inc(Index);
end;
..
Wenn ich später von 1Mio Datensätzen 300 abrufen will, dann werde ich einfach die 300 Id`s, RecNo o.ä. in einer Anfrageliste übergeben und die Ergebnisse dann vom Server aus anfügen und zurück schicken.
Insofern macht es schon Sinn, direkt mit Stringlists zu arbeiten.
Vielen Dank Euch allen für die Hilfe! (und für mjustin ein
extra)