jwz104
jwz104

Reputation: 367

IdTcpClient repeat ReadLn command

I want to make a function on the Idtcpclient that repeats the ReadLn command. But how can i do this? I don't want to use a timer because a timer is slow. I allready searched on google but i don't understand it..

Upvotes: 0

Views: 515

Answers (2)

I create a unit to my program, I hope to help you:

unit uSerialAuthentication;

interface

uses System.SysUtils, IdTCPClient, IdThreadComponent, FMX.Dialogs;

type
  TSerialAuthentication = class (TObject)
    IdTCPClient: TIdTCPClient;
    procedure IdThreadComponentRun(Sender: TIdThreadComponent);
  public
    constructor Create (Host : string; Port: Word);
    destructor Destroy; override;
    procedure OnConnect(Sender: TObject);
  end;
var
  idThreadComponent   : TIdThreadComponent; // Thread
  Access : Boolean;

implementation

{ SerialAuthentication }

procedure TSerialAuthentication.OnConnect(Sender: TObject);
begin
  ShowMessage('Connected');
  IdThreadComponent.Active  := True;
end;

constructor TSerialAuthentication.Create(Host : string; Port: Word);
begin
  IdTCPClient := TIdTCPClient.Create();
  IdTCPClient.Host := Host;
  IdTCPClient.Port := Port;
  IdTCPClient.OnConnected := OnConnect;
  idThreadComponent           := TIdThreadComponent.Create();
  idThreadComponent.OnRun     := IdThreadComponentRun;
  Access := False;
end;

destructor TSerialAuthentication.Destroy;
begin
  IdTCPClient.Disconnect;
  if idThreadComponent.active then
  begin
      idThreadComponent.active := False;
  end;
  FreeAndNil(IdThreadComponent);
  if Assigned(IdTCPClient) then
    FreeAndNil (IdTCPClient);
  inherited;
end;


procedure TSerialAuthentication.IdThreadComponentRun(Sender: TIdThreadComponent);
var
  recv : String;
begin
  recv :=  IdTCPClient.IOHandler.ReadLn();  // READ
  if length(recv)>0 then
    if recv = 'Ready' then
      Access := True
    else
      Access :=  False;
end;

end.

Upvotes: 0

mjn
mjn

Reputation: 36634

The client can be placed in a separate thread, and use a loop to repeat the ReadLn until it succeeds. The time out can be given as an argument to ReadLn so that the next try will happen after the timeout interval. Make sure to handle connection loss, for example by reconnecting in a loop.

Upvotes: 0

Related Questions