Witam.
Łącze dwa programiki przez TCP. Programy muszą czodzić bardzo stabilnie a jest pewien problem.
Programik klienta łączy się z serwerem przesyła dane i rozłącza się dopiero po 5s (tak musi działać). Jeżeli w czasie gdy client jest podłączony ktoś zechce wyłączyć serwer to wyświetli mu się błąd ("Terminate Thread Timeout" a w trybie debagowania wyświetla się bład "... raised exception class EIdClosedSocket with message 'Disconnect' " . To samo sie dzieje przy próbie deaktywacji serwera.
Jak bezpiecznie wyłączyć serwer lub go deaktywować?
A to fragment kodu servera:
//aktywacja/deaktywacja
procedure TServerFrmMain.CBServerActiveClick(Sender: TObject);
begin
Server.Active:=CBServerActive.Checked;
end;
procedure TServerFrmMain.ServerConnect(AThread: TIdPeerThread);
var
NewClient: PClient;
begin
GetMem(NewClient, SizeOf(TClient));
NewClient.DNS := AThread.Connection.LocalName;
NewClient.Connected := Now;
NewClient.LastAction := NewClient.Connected;
NewClient.Thread :=AThread;
AThread.Data:=TObject(NewClient);
try
Clients.LockList.Add(NewClient);
finally
Clients.UnlockList;
end;
end;
procedure TServerFrmMain.ServerExecute(AThread: TIdPeerThread);
var
ActClient, RecClient: PClient;
CommBlock, NewCommBlock: TCommBlock;
RecThread: TIdPeerThread;
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
AThread.Connection.ReadBuffer (CommBlock, SizeOf (CommBlock));
ActClient := PClient(AThread.Data);
ActClient.LastAction := Now;
.
.
.
end;
end;
procedure TServerFrmMain.ServerDisconnect(AThread: TIdPeerThread);
var
ActClient: PClient;
begin
ActClient := PClient(AThread.Data);
Protocol.Lines.Add (TimeToStr(Time)+' Disconnect from "'+ActClient^.DNS+'"');
try
Clients.LockList.Remove(ActClient);
finally
Clients.UnlockList;
end;
FreeMem(ActClient);
AThread.Data := nil;
end;
procedure TServerFrmMain.FormCreate(Sender: TObject);
begin
Clients := TThreadList.Create;
end;
procedure TServerFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Server.Active := False;
Clients.Free;
end;
Z góry dziękuje za pomoc