16,747
社区成员




if Flag=1 then begin
GetDataFormServer;
if Not OK then Flag := 2;
end else begin
try
CheckConnect;
Flag := 1;
except
inc(iConnectCount);
...
end;
end;
type
TThreadMain = class;
TThreadReConnect = class(TThread)
private
{ Private declarations }
a: TThreadMain;
procedure ReConnect;
protected
procedure Execute; override;
public
iConnectCount: word;
bReConnectOk: Boolean;
constructor create(p:TThreadMain);
destructor Destroy; override;
end;
//
TThreadMain = class(TThread)
private
{ Private declarations }
bOk: Boolean;
ThreadReConnect: TThreadReConnect;
procedure GetDataFormServer;
protected
procedure Execute; override;
public
constructor create(p:boolean);
destructor Destroy; override;
end;
{TThreadMain}
constructor TThreadMain.create(p:Boolean);
begin
inherited Create(p);
ThreadReConnect := TThreadReConnect.create(self);
end;
destructor TThreadMain.Destroy;
begin
ThreadReConnect.Terminate;
if ThreadReConnect.Suspended then
ThreadReConnect.Resume;
ThreadReConnect.WaitFor;
ThreadReConnect.Free;
inherited;
end;
procedure TThreadMain.GetDataFormServer;
begin
bOK := true;
try
{do something} //从服务器提取数据
except
bOK := false;
end;
end;
procedure TThreadMain.Execute;
var
i:Word;
begin
i := 2;
while not Terminated do
begin
Sleep(1000);
if i = 1 then
begin
Synchronize(GetDataFormServer);
if not bOk then
begin
ThreadReConnect.iConnectCount := 0;
if ThreadReConnect.Suspended then
ThreadReConnect.Resume;
self.Suspend;
end;
end;
i := i mod 60;
inc(i);
end;
end;
{TThreadReConnect}
constructor TThreadReConnect.create(p:TThreadMain);
begin
inherited Create(true);
a := p;
bReConnectOk := false;
end;
destructor TThreadReConnect.Destroy;
begin
inherited;
end;
procedure TThreadReConnect.Execute;
begin
while not Terminated do
begin
if Terminated then
break;
sleep(2000);
Synchronize(ReConnect);
if Terminated then
break;
end;
end;
procedure TThreadReConnect.ReConnect;
begin
bReConnectOk := false;
try
CheckConnect; //检查连接是否成功
bReConnectOk := true;
if a.Suspended then
a.Resume;
self.Suspend;
except
inc(iConnectCount);
if iConnectCount > 360 then
begin
showmessage('Can''t connect to Server,Please check network.');
PostMessage(frmMain.Handle, wm_close, 0, 0);
end;
end;
end;