作为tcp客户端,使用TIdTcpClient控件,在与后台服务的交互时,如果出现网络异常,或者后台服务重启,会导致无法保存数据或查询后台数据,这种情况下可以开启断线重连线程,自动连接上后台服务
unit threadReconnectServer;
interface
uses
Classes, SysUtils, ScktComp, windows, ComCtrls, forms, activex, StdCtrls, strutils, IdTCPClient, Global;
type
TReconnectServerThread = class(TThread)
private
client: TIdTCPClient;
protected
procedure Execute; override;
public
constructor Create(IdTCPClient1: TIdTCPClient);
destructor Destroy; override;
end;
implementation
constructor TReconnectServerThread.Create(IdTCPClient1: TIdTCPClient);
begin
inherited Create(True);
client := IdTCPClient1;
FreeOnTerminate := False;
end;
destructor TReconnectServerThread.Destroy;
begin
inherited destroy;
end;
procedure TReconnectServerThread.Execute;
begin
while not Terminated do
begin
Sleep(5000);
try
client.Disconnect;
client.Connect;
gOnlineSuccess := True;
Suspend;
except
on e: Exception do
begin
gOnlineSuccess := False;
end;
end;
end;
end;
end.
在主窗体create中创建线程对象,创建成功后,并不会执行线程,在需要的时候,唤醒线程即可
// 声明
ReconnectServerThread: TReconnectServerThread;
// 在create中
// 断线重连线程
ReconnectServerThread := TReconnectServerThread.Create(IdTCPClient1);
function TfrmMain.SendMsgToServer(msg: string): Boolean;
procedure ReconnectServer;
begin
gOnlineSuccess := False;
// 启动重连线程
ReconnectServerThread.Resume;
end;
begin
Result := false;
try
if gOnlineSuccess and IdTCPClient1.Connected then
begin
// 末尾加上分割符,保证数据传输到服务器后,能正确按Json解析
IdTCPClient1.IOHandler.Write(msg + '&&', IndyTextEncoding(TEncoding.UTF8));
Result := true;
end
else
begin
ReconnectServer;
end;
except
on e: Exception do
begin
ReconnectServer;
end;
end;
end;