现在的位置: 首页 > 综合 > 正文

自动检查网络连接状况,如果异常自动重连

2011年02月17日 ⁄ 综合 ⁄ 共 2520字 ⁄ 字号 评论关闭

{
author:cxg
断网自动检查并提示,自动重连
}

unit ClientTestConnected;

interface

uses
  SysUtils, Classes, SqlExpr,uNetCommon;

type
  TWaitThread = class(TThread)
  private
    { Private declarations }
    fNetConnect:Boolean;
    FCheckInterval: Integer;
    FMsg: string;
  protected
    procedure ShowMsg;
    procedure Execute; override;
    procedure ServerOpen;
    procedure ServerClose;
    function ConnRemoteSvr(cn:TSQLConnection;const hostname,UserName,password:string;
      const port:Integer):Boolean;
  public
    NetCheck1: TNetCheck;
    constructor Create(const ACheckInterval: Integer);
    destructor Destroy; override;

    procedure CheckNetConnect(Sender: TObject; var objWbemObject,
      objWbemAsyncContext: OleVariant);
    procedure CheckNetDisconnect(Sender: TObject; var objWbemObject,
      objWbemAsyncContext: OleVariant);
  end;

implementation

uses ClientForm;

procedure TWaitThread.ServerClose;
begin
  FrmMain.SQLConnection1.Close;
end;

procedure TWaitThread.ServerOpen;
begin
  if fNetConnect then
  FMsg := '正在连接...'
  else FMsg :='网络异常';
  Synchronize(ShowMsg);
  if ConnRemoteSvr(FrmMain.SQLConnection1,'localhost','cxg','123',211) then
  begin
    FMsg := '网络正常';
    Synchronize(ShowMsg);
  end;
end;

procedure TWaitThread.ShowMsg;
begin
  FrmMain.Label1.Caption := FMsg;
end;

procedure TWaitThread.Execute;
begin
  try
    ServerOpen;
    fNetConnect :=True;
  except
    fNetConnect :=False;
  end;

  repeat
    Sleep(FCheckInterval);
    if not fNetConnect then
    begin
      FCheckInterval := 3000;
      ServerClose;
      ServerOpen;
    end;
  until Terminated;
end;

procedure TWaitThread.CheckNetConnect(Sender: TObject; var objWbemObject,
  objWbemAsyncContext: OleVariant);
begin
  fNetConnect := True;
end;

procedure TWaitThread.CheckNetDisconnect(Sender: TObject; var objWbemObject,
  objWbemAsyncContext: OleVariant);
begin
  fNetConnect :=False;
end;

function TWaitThread.ConnRemoteSvr(cn: TSQLConnection; const hostname, UserName,
  password: string; const port: Integer): Boolean;
begin
  try
  cn.Close;
  cn.DriverName := 'DataSnap';
  cn.LoginPrompt :=False;
  Cn.ConnectionName := 'DataSnapCONNECTION';
  cn.Params.Clear;
  cn.Params.Add('DriverName=DataSnap');
  Cn.Params.Add('HostName='+HostName);
  Cn.Params.Add('Port='+inttostr(port));
  Cn.Params.Add('User_Name='+UserName);
  Cn.Params.Add('Password='+PassWord);
  cn.Open;
  Result :=True;
  except
    Result :=False;
  end;
end;

constructor TWaitThread.Create(const ACheckInterval: Integer);
begin
  FCheckInterval := ACheckInterval;
  NetCheck1 :=TNetCheck.Create(nil);
  NetCheck1.OnNetWireConnect:=CheckNetConnect;
  NetCheck1.OnNetWireDisconnect:=CheckNetDisconnect;
  inherited Create(False);
end;

destructor TWaitThread.Destroy;
begin
  NetCheck1.Free;
  NetCheck1 :=nil;
  inherited;
end;

end.

 

 

抱歉!评论已关闭.