![]() |
TCPserver Disconnect Problem
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:
und hier der code beim connect/disconnect
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;
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; |
Re: TCPserver Disconnect Problem
Könnte daran liegen das beim Disconnect der ClientThread aus der Liste gelöscht wird und die nachfolgenden nachrutschen.
somit wird der erste Client gelöscht und der 2te nimmt dessen Position in der Liste ein... das führt dazu das in der Liste nur noch 1 Element ist (0) und beim Zugriff auf [1] eine AV auftritt |
Re: TCPserver Disconnect Problem
Hi,
wenn Du einen Client löscht bzw. dieser sich disconnected, verringert sich die Anzahl der Clients. Deshalb solltest Du :
Delphi-Quellcode:
Ausserdem solltest Du nicht :
// Liste umgekehrt durchlaufen
for Count := ClientList.Count -1 downto 0 do begin // Deine Zeile for Count := 0 to ClientList.Count -1 do begin
Delphi-Quellcode:
verwenden. Denn dadurch können Clients die gleiche Nummer erhalten !!!!
Client.No := lbClients.Items.Count;
Stattdessen solltest Du eine globale Zählervariable verwenden, die Du einfach immer um 1 erhöst und diese dann als Client.No verwenden. Gruß Data |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz