我想在Idtcpclient上做一个重复ReadLn命令的函数。但是我怎么做呢?我不想用计时器,因为计时器很慢。我已经在谷歌上搜索过了,但是我不明白。
nzkunb0c1#
客户端可以放在单独的线程中,并使用循环重复ReadLn,直到成功。可以将超时作为ReadLn的参数给定,以便在超时间隔后进行下一次尝试。请确保处理连接丢失,例如通过在循环中重新连接。
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.
2条答案
按热度按时间nzkunb0c1#
客户端可以放在单独的线程中,并使用循环重复ReadLn,直到成功。可以将超时作为ReadLn的参数给定,以便在超时间隔后进行下一次尝试。请确保处理连接丢失,例如通过在循环中重新连接。
efzxgjgh2#
我给我的单位创建一个程序,希望对大家有所帮助: