Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi max Länge TCPIP (https://www.delphipraxis.net/216803-max-laenge-tcpip.html)

jaenicke 10. Mär 2025 11:51

AW: max Länge TCPIP
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1546939)
Ich verstehe was du meinst aber wenn ich vorher den InputBuffer auf <> Empty abfrage, dann bleibt mein Thread mit dem ReadLn nur bis zum nächsten gelesen Terminator hängen. Richtig?

Ja, schon, aber wenn keine Daten mehr kommen, wartet die Funktion einfach weiter. Wenn du das Programm dann beenden möchtest, kannst du den Lesevorgang nicht sauber beenden.

Zitat:

Zitat von AJ_Oldendorf (Beitrag 1546939)
Auf welchen Wert sollte man das Timeout denn setzen? Erfahrungen?

Das kommt auf die Größe der Pakete an und wie lange es dauern darf, bis der Thread sich auf Anforderung beendet. Ich nehme meistens 100 bis 500 Millisekunden, weil das die Verzögerung gering genug hält, dass niemand beim Beenden bewusst warten muss, andererseits aber auch nicht zu oft versucht wird zu lesen.

Zitat:

Zitat von AJ_Oldendorf (Beitrag 1546939)
Was passiert, wenn Timeout abläuft und er nicht bis zum Terminator gelesen hat? Bekomme ich dann wieder nur ein Teilstring von meinem Telegramm?

Das kannst du ja leicht testen. Soweit ich mich erinnere, wird der schon angekommene Teil nicht zurückgeliefert, sprich du bekommst einen Leerstring und beim nächsten Aufruf alles. Du kannst aber prüfen, ob ein Timeout aufgetreten ist, indem du ReadLnTimedOut abfragst.

AJ_Oldendorf 11. Mär 2025 08:35

AW: max Länge TCPIP
 
@jaenicke:
Danke, ich prüfe das mal mit dem Leerstring und dem Timeout.

Sag mal, beim Server ist es aktuell so, dass wenn sich ein Client verbunden hat, die CPU Auslastung auf ca 6% von dem Programm geht.
Es werden keine Daten verschickt vom Server und vom Client. Einfach nur das Verbinden.
Wenn ich beim Server das Active auf False setze, geht die Auslastung sofort runter.
Hat jemand eine Idee dazu?

jaenicke 11. Mär 2025 08:52

AW: max Länge TCPIP
 
Zum Server lässt sich ohne Quelltext nicht viel sagen. Du kannst nur mal zwischendurch anhalten und schauen, wo du gerade bist.

Hast du vielleicht ein OnExecute mit Schleife, in der du kein Sleep(1) drin hast (wenn keine Anfrage da war), um die Schleifendurchläufe im Leerlauf zu begrenzen?

AJ_Oldendorf 11. Mär 2025 09:16

AW: max Länge TCPIP
 
Also ich habe eine Form mit TIdTCPServer und verknüpften TIdServerIOHandlerStack.

Delphi-Quellcode:
procedure TMyForm.FormCreate(Sender: TObject);
begin
  IdTCPServer1.DefaultPort := 44001;
end;

procedure TMyForm.FormDestroy(Sender: TObject);
begin
  IdTCPServer1.Active := False;
end;

procedure TMyForm.IdTCPServer1Connect(AContext: TIdContext);
begin
  if Assigned(LogSL) then
  begin
    LogSL.Add('A client connected');
  end;
end;

procedure TMyForm.IdTCPServer1Disconnect(AContext: TIdContext);
begin
  if Assigned(LogSL) then
  begin
    LogSL.Add('A client disconnected');
  end;
end;

procedure TMyForm.IdTCPServer1Exception(AContext: TIdContext;
  AException: Exception);
begin
  if Assigned(LogSL) then
  begin
    LogSL.Add('A exception happend !');
  end;
end;

procedure TMyForm.IdTCPServer1Execute(AContext: TIdContext);
var
  tmpStr : String;
begin
  if IdTCPServer1.Active then
  begin
    if not AContext.Connection.IOHandler.InputBufferIsEmpty then
    begin
      tmpStr := AContext.Connection.IOHandler.ReadLn('#~#*', 300, -1);
      LogSL.Add(tmpStr);

      Timer1.Enabled := True;
    end;
  end;
end;
Das ist im groben alles...

jaenicke 11. Mär 2025 11:48

AW: max Länge TCPIP
 
Pack mal am Ende des OnExecute ein Sleep(1) rein oder verwende
Delphi-Quellcode:
AContext.Connection.IOHandler.CheckForDataOnSource(10);
, damit die Anzahl der Aufrufe reduziert wird, dann sollte das nicht mehr passieren.

AJ_Oldendorf 11. Mär 2025 13:39

AW: max Länge TCPIP
 
Der Aufruf von
Delphi-Quellcode:
AContext.Connection.IOHandler.CheckForDataOnSource(10);
vor dem
Delphi-Quellcode:
if not AContext.Connection.IOHandler.InputBufferIsEmpty then
hat geholfen bzgl der CPU Auslastung.
Du meintest ja sicherlich davor aufrufen oder?

Wie ist es beim Client?
Da habe ich das mit der CPU Auslastung bisher nicht festgestellt (der Lesevorgang mit "InputBufferIsEmpty" und "ReadLn" ist dort auch in einem Thread ausgelagert).
Sollte man dort auch
Delphi-Quellcode:
TCPClient.IOHandler.CheckForDataOnSource(10);
aufrufen?

Sleep(1) wird nicht gebraucht :-)

jaenicke 11. Mär 2025 13:46

AW: max Länge TCPIP
 
Sehr gut, ja, ich meinte davor aufrufen. Und Sleep(1) war nur eine Alternative, die brauchst du dann nicht, nein.

Im Client brauchst du das nicht, wenn du ReadLn verwendest. Wenn nicht, eines der beiden schon, so habe ich es ja auch in meinem Codebeispiel drin (das Sleep).

AJ_Oldendorf 11. Mär 2025 13:59

AW: max Länge TCPIP
 
Ja ich verwende im Client das ReadLn. Hatte nur gefragt, da ich es ja im Server auch verwende das ReadLn.

Danke für die Unterstützung bisher


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz