Einzelnen Beitrag anzeigen

th_bone

Registriert seit: 16. Jun 2004
172 Beiträge
 
Delphi 2005 Professional
 
#1

TCPserver Disconnect Problem

  Alt 16. Dez 2005, 16:56
Hi,

folgendes problem ich will die Clientliste bei jedem Client bei disconnect eines clients refreshen
klappt soweit auch, wenn ich die clients in der reihenfolge des connects wieder disconnecte

also connect 1,2 dann disconnect 2,1

ändere ich jetzt die Reihenfolge, des disconnect auf 1,2 (der zuerst eingeloggte Client loggt sich als erstes aus)
dann kriege ich eine EAccessViolation

ich hab den code auch schon mal mit den Chatdemos verglichen finde den Fehler aber leider nicht...

Danke

Ralf

hier die Problemstelle
Delphi-Quellcode:
procedure Tform1.BroadcastClientList;
var
  Count: Integer;
  List : TList;
begin
  List := tcpServer.Contexts.LockList;
    try
     for Count := 0 to ClientList.Count -1 do begin
      // hier wird die EAccessviolation ausgelöst
      TIdContext(List.Items[Count]).Connection.iohandler.WriteLn(form1.lbClients.Items.CommaText);
      // hier wird die EAccessviolation ausgelöst
     end;
    except
    end;
  tcpServer.Contexts.UnlockList;
end;
und hier der code beim connect/disconnect
Delphi-Quellcode:
type
  // Speichert TCPclients
  TClient = class(TObject)
    Name : String;
    No : Integer;
    Thread : Pointer;
  end;
//......

var
  Clientlist : TList;
//......

procedure TForm1.tcpServerConnect(AContext: TIdContext);
var
  Client : TClient;
begin
  Client := TClient.Create;
    Client.Name := 'Logging In';
    Client.No := lbClients.Items.Count;
    Client.Thread := AContext;
  AContext.Data := Client;

  Clientlist.Add(Client);
end;
//....

procedure TForm1.tcpServerDisconnect(AContext: TIdContext);
var
  Client : TClient;
begin
  Client := Pointer(AContext.Data);

  Clientlist.Delete(Client.No);

  Client.Free;
  AContext.Data := nil;

  BroadcastClientlist;
end;
  Mit Zitat antworten Zitat