delphi IdTcpClient重复ReadLn命令

jrcvhitl  于 2023-02-22  发布在  其他
关注(0)|答案(2)|浏览(477)

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

nzkunb0c

nzkunb0c1#

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

efzxgjgh

efzxgjgh2#

我给我的单位创建一个程序,希望对大家有所帮助:

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.

相关问题