Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Wieso wird OnDisconnect mehrfach ausgeführt? (https://www.delphipraxis.net/55065-wieso-wird-ondisconnect-mehrfach-ausgefuehrt.html)

Pseudemys Nelsoni 16. Okt 2005 08:01


Wieso wird OnDisconnect mehrfach ausgeführt?
 
Moin,

ich habe folgendes:

Delphi-Quellcode:
procedure TServServ.TimerHandler(Sender: TObject);
var
  I: Integer;
begin
  for I := FUserList.Count-1 downto 0 do
    if (TUser(FUserList.Items[I]).FLastMessage + FSessionTimeout) < GetTickCount then
      TUser(FUserList.Items[I]).FSocket.Close;
end;

function TServServ.UserBySock(Socket: TCustomWinSocket): TUser;
var
  I: Integer;
begin
  Result := nil;
  for I := 0 to FUserList.Count-1 do
    if TUser(FUserList.Items[I]).FSocket = Socket then
      Result := TUser(FUserList.Items[I]);
end;

procedure TServServ.ClientDisconnect(Sender: TObject; ASocket: TCustomWinSocket);
begin
  messagebox(0, pchar(inttostr(FUserList.Count)), 'hi', 0);
  FUserList.Remove(UserBySock(ASocket));
end;
Die MessageBox ist nur Testweise drin. Es handelt sich hier um einen ServerSocket. Wenn ich auf diesen mit einem Client verbinde, wird dieser nach 5 Sekunden disconnectet (FLastMessage + FSessionTimeout) < GetTickCount), das Problem ist, dass nach diesen 5 Sekunden unendlich MessageBoxen (aus der ClientDisconnect prozedur) aufpoppen, dass muss heissen, dass das Timer event ewig einen User findet der länger als 5 Sekunden verbunden ist, das wiederrum muss heissen, dass obwohl der User bereits disconnected ist, sein Objekt in der Userlist noch existiert.... wie aber kann das sein? ich lösche es doch: "FUserList.Remove(UserBySock(ASocket));"

Hm.... vielleicht hat ja jemand nen Tipp

marabu 16. Okt 2005 08:17

Re: Wieso wird OnDisconnect mehrfach ausgeführt?
 
Deine UserBySocket-Funktion funktioniert aber nur, wenn es sich um den letzten User in der Liste handelt. Du musst die Schleife mit Break oder Exit verlassen, sobald du den User ermittel hast.

Grüße vom marabu

Pseudemys Nelsoni 16. Okt 2005 08:23

Re: Wieso wird OnDisconnect mehrfach ausgeführt?
 
Moin Marabu,

danke für deine Antwort, aber jede neue Verbindung hat ja ein anderes Sockethandle, demnach kann eigentlich kein doppeltes Objekt vorkommen. Übrigens: ich verbinde nur mit _einem_ Client und hab den Fehler.

Wenn ich es nun so habe:

Delphi-Quellcode:
procedure TServServ.ClientDisconnect(Sender: TObject; ASocket: TCustomWinSocket);
begin
  messagebox(0, pchar(inttostr(FServerSocket.Socket.ActiveConnections)), 'hi', 0);
  FUserList.Remove(UserBySock(ASocket));
end;
dann bekomme ich laufend "1" angezeigt, je nach Timerintervall. Hab selbigen auf 1000, nun bekomme ich jede Sekunde "1" angezeigt. Wieso das ClientDisconnect() immer vom TImer aus aufgerufen wird, ist mir schleierhaft.

Pseudemys Nelsoni 16. Okt 2005 08:35

Re: Wieso wird OnDisconnect mehrfach ausgeführt?
 
ich habs...die messagebox war schuld...da sie vor dem löschen des objekts war

marabu 16. Okt 2005 08:57

Re: Wieso wird OnDisconnect mehrfach ausgeführt?
 
Hi,

ich hatte übersehen, dass du das Result in der Schleife nur bedingt setzt. Insofern liefert deine Funktion natürlich das richtige Ergebnis. Und solange du nur kleine Mengen User verarbeitest ist ein fehlendes Break auch kein performance killer.

marabu

Pseudemys Nelsoni 16. Okt 2005 09:01

Re: Wieso wird OnDisconnect mehrfach ausgeführt?
 
Gut :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 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