Der Titel ist etwas schwierig zu formulieren. Hier mal um was es geht:
IdTcpServer stellt ja ein Ereignis OnExecute bereit, das ausgelöst wird, sobald Daten von einem Client empfangen werden. Meine bisherige Vorgehensweise war, in diesem Event die Daten zu nehmen, zu verarbeiten und fertig. Die Prozedur wird dann beendet.
Jetzt habe ich aber in einem Beispiel für die Indys folgenden Quelltext gesehen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| procedure TForm1.IdTCPServerExecute(AContext: TIdContext); var connected: boolean; line: string; connectionNumber: integer; begin
connectionNumber:= 0; while (ledConnected[connectionNumber].Brush.Color = clOn) do inc(connectionNumber);
ledConnected[connectionNumber].Brush.Color:= clOn;
AContext.Connection.IOHandler.WriteLn('Hello'); connected:= true; while connected do begin try line:= AContext.Connection.IOHandler.ReadLn; AContext.Connection.IOHandler.WriteLn('>>'+line); memo1.Lines.add(format('[%d] %s',[connectionNumber,line])); if (ansiUpperCase(line) = 'BYE') or (ansiUpperCase(line) = 'QUIT') then begin AContext.Connection.Disconnect; connected:= false; end; except connected:= false; end; end;
ledConnected[connectionNumber].Brush.Color:= clOff;
end; |
Im hervorgehobenen Bereich sieht man, dass eine while-Schleife in diesem Event verwendet wird, bis der Client den Befehl zum Trennen gibt. Jetzt ist in mir die Frage aufgetaucht, was besser ist: Daten verarbeiten und fertig oder auf weitere Daten in einer while-Schleife zu warten.
Was verbraucht weniger Resourcen, was ist schneller? Läuft OnExecute in dem Verbindungsthread für den Client ab oder hat das Ausführen dieser Prozedur einen größeren Overhead?
Es geht vor allem um die Performance, das beides geht, ist mir klar
