Einzelnen Beitrag anzeigen

sveni2211

Registriert seit: 22. Dez 2006
Ort: Friedrichroda
38 Beiträge
 
#3

Re: Indy TCP Server - On Execute = 100% Prozessorlast

  Alt 12. Sep 2007, 18:49
Ok. Hier mal das Test-Programm:

Delphi-Quellcode:
unit u_TestServer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPServer;

type
  TfMainForm = class(TForm)
    TCP_Connection: TIdTCPServer;
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure TCP_ConnectionConnect(AContext: TIdContext);
    procedure TCP_ConnectionExecute(AContext: TIdContext);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  fMainForm: TfMainForm;

implementation
USES Client_Communication;
{$R *.dfm}

procedure TfMainForm.FormShow(Sender: TObject);
begin
  TCP_Connection.Active:=true;
end;

procedure TfMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  TCP_Connection.Active:=false;
end;

procedure TfMainForm.TCP_ConnectionConnect(AContext: TIdContext);
begin
  AContext.Data:=TClientComm.Create;
end;

procedure TfMainForm.TCP_ConnectionExecute(AContext: TIdContext);
begin
  Handle_IncomingData(AContext);
end;

end.
Sobald nun ein Client sich zu dem Server verbindet wird das OnConnect einmal ausgeführt (pro Client- Verbindung).
Aber ab der ersten Verbindung wir die letzte Prozedur (Execute) permanent ausgelöst, obwohl der Client keine Daten sendet.
Wenn ich in der Funktion Handle_IncomingData auf die Connection.IOHandler.InputBuffer.Size teste ist diese 0, außer der Client sendet was. In dem Fall wird die Funktion zu Ende ausgeführt. Aber die Prozedur Execute vom TCP Server wird ständig aufgerufen obwohl KEINE Daten angekommen sind. Und eben dieses verursacht die Last.
Der Client verhält sich normal. Erzeugt keine Prozessorlast, außer wenn er halt was sendet (kurzzeitig).
  Mit Zitat antworten Zitat