AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Wieso wird OnDisconnect mehrfach ausgeführt?
Thema durchsuchen
Ansicht
Themen-Optionen

Wieso wird OnDisconnect mehrfach ausgeführt?

Ein Thema von Pseudemys Nelsoni · begonnen am 16. Okt 2005 · letzter Beitrag vom 16. Okt 2005
Antwort Antwort
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

Wieso wird OnDisconnect mehrfach ausgeführt?

  Alt 16. Okt 2005, 09:01
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
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Wieso wird OnDisconnect mehrfach ausgeführt?

  Alt 16. Okt 2005, 09:17
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
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#3

Re: Wieso wird OnDisconnect mehrfach ausgeführt?

  Alt 16. Okt 2005, 09:23
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.
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#4

Re: Wieso wird OnDisconnect mehrfach ausgeführt?

  Alt 16. Okt 2005, 09:35
ich habs...die messagebox war schuld...da sie vor dem löschen des objekts war
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Wieso wird OnDisconnect mehrfach ausgeführt?

  Alt 16. Okt 2005, 09:57
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
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#6

Re: Wieso wird OnDisconnect mehrfach ausgeführt?

  Alt 16. Okt 2005, 10:01
Gut
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz