IdTcpClient 重复 ReadLn 命令

问题描述 投票:0回答:2

我想在重复 ReadLn 命令的 Idtcpclient 上创建一个函数。 但是我该怎么做呢?我不想使用计时器,因为计时器很慢。 我已经在谷歌上搜索过,但我不明白..

delphi indy delphi-xe5
2个回答
0
投票

客户端可以放在单独的线程中,使用循环重复ReadLn,直到成功。超时可以作为 ReadLn 的参数给出,以便下一次尝试将在超时间隔之后发生。确保处理连接丢失,例如通过循环重新连接。


0
投票

我为我的程序创建了一个单元,希望对您有所帮助:

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.
© www.soinside.com 2019 - 2024. All rights reserved.