Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Indy: Connect dauert unnötig lange

  Alt 17. Jun 2019, 11:58
In Wireshark fiel mir auf dass der Socket zwischen dem PC und einem Gerät sehr schnell aufgebaut wird, der PC allerdings erst 125 ms danach sich traut etwas zu schicken.

Ich wühlte etwas im Indy Sourcecode und siehe da:

IdIOHandlerStack.pas

Delphi-Quellcode:
procedure TIdIOHandlerStack.ConnectClient;

  procedure DoConnectTimeout(ATimeout: Integer);
  var
    LSleepTime: Integer;
    LThread: TIdConnectThread;
  begin
    if ATimeout = IdTimeoutDefault then begin
      ATimeout := IdTimeoutInfinite;
    end;
    LThread := TIdConnectThread.Create(Binding);
    try
      // IndySleep
      if TIdAntiFreezeBase.ShouldUse then begin
        LSleepTime := IndyMin(GAntiFreeze.IdleTimeOut, 125);
      end else begin
        LSleepTime := 125;
      end;

      if ATimeout = IdTimeoutInfinite then begin
        while not LThread.Terminated do begin
          IndySleep(LSleepTime);
          TIdAntiFreezeBase.DoProcess;
        end;
      end else
      begin
                                                                        
        // decrement by the sleep interval. If IndySleep() runs longer then
        // requested, that would slow down the loop and exceed the original
        // timeout that was requested...
        while (ATimeout > 0) and (not LThread.Terminated) do begin
          IndySleep(IndyMin(ATimeout, LSleepTime));
          TIdAntiFreezeBase.DoProcess;
          Dec(ATimeout, IndyMin(ATimeout, LSleepTime));
        end;
      end;

(...)
Abgesehen davon dass ich das mit einem reinen Sleep relativ ungeschickt gelöst finde (warum kein Event auf das gewartet wird) - Wie vernünftig sind hier die hartkodierten 125 ms? Ist das nicht ein bisschen sehr viel?
  Mit Zitat antworten Zitat