![]() |
Wieso wird OnDisconnect mehrfach ausgeführt?
Moin,
ich habe folgendes:
Delphi-Quellcode:
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));"
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; Hm.... vielleicht hat ja jemand nen Tipp |
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 |
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:
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.
procedure TServServ.ClientDisconnect(Sender: TObject; ASocket: TCustomWinSocket);
begin messagebox(0, pchar(inttostr(FServerSocket.Socket.ActiveConnections)), 'hi', 0); FUserList.Remove(UserBySock(ASocket)); end; |
Re: Wieso wird OnDisconnect mehrfach ausgeführt?
ich habs...die messagebox war schuld...da sie vor dem löschen des objekts war
|
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 |
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