AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Indy 10 TIdTCPServer in Thread
Thema durchsuchen
Ansicht
Themen-Optionen

Indy 10 TIdTCPServer in Thread

Ein Thema von schwa226 · begonnen am 5. Jan 2011 · letzter Beitrag vom 5. Jan 2011
Antwort Antwort
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#1

Indy 10 TIdTCPServer in Thread

  Alt 5. Jan 2011, 19:00
Hi,

ich habe ein kleines Problem wo ich nicht draufkomme.
Ich habe einen Thread, der einen TIdTCPServer im constructor erstellt.


Wenn der Thread terminiert wird, wird der TIdTCPServer.Active auf False gesetzt und danach sollte TIdTCPServer.Free ausgeführt werden.

Wenn nun kein Client verbunden war geht das ohne Probleme.
Wenn aber ein Client verbunden war/ist bleibt es bei TIdTCPServer.Active := False stehen.

Delphi-Quellcode:
procedure TExtra_Thread.Execute();
var
begin


  while (not Terminated) do
  begin
     // do some things
    Sleep(1);
  end; // while (not Terminated) do

  // destroy TCP server:
  TCP_Server.Active := False;
  TCP_Server.Free;
end;
Komme nicht weiter!?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.779 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Indy 10 TIdTCPServer in Thread

  Alt 5. Jan 2011, 19:35
Guten Abend,

Du kannst abfragen ob noch clients verbunden sind.
Wenn ja, diese Verbindungen gracefully beenden.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#3

AW: Indy 10 TIdTCPServer in Thread

  Alt 5. Jan 2011, 20:43
Wo finde ich das CloseGracefully?

Im TIdTCPServer oder TIdContext?

Weiter Versuche haben gezeigt, dass der Thread hängen bleibt, wenn ich bei einem Clienten ein Disconnect durchgeführt hatte.

TIdContext(Active_Client.AContext).Connection.Disconnect Wenn dies einmal gemacht wurde kann man den Server nicht mehr beenden.

Aber irgendwie muss ich ja Clients von der Server Seite her rausschmeißen können...
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.779 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Indy 10 TIdTCPServer in Thread

  Alt 5. Jan 2011, 20:51
Delphi-Quellcode:
   if assigned(FServer) then
      begin
        if FServer.Contexts.LockList.Count > 0 then
          for i:=0 to FServer.Contexts.LockList.Count -1 do
            begin
              TIdContext(FServer.Contexts.LockList[i]).Connection.IOHandler.CloseGracefully;
            end;
        FServer.Contexts.UnlockList;
        FServer.Active:=false;
        sleep(150);
        FServer.free;
Wobei hier FServer vom Typ TIdTCPServer ist.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#5

AW: Indy 10 TIdTCPServer in Thread

  Alt 5. Jan 2011, 20:55
Danke, aber das CloseGracefully hat nicht funktioniert.

So klappt es:
Delphi-Quellcode:
    TIdContext(Active_Client.AContext).Connection.IOHandler.CloseGracefully;
    TIdContext(Active_Client.AContext).Connection.IOHandler.DiscardAll;
Also erst Verbindung trennen und dann die Daten per DiscardAll Verwerfen.
Es wird dann ganz normal die OnDisconnect aufgerufen und der Server lässt sich beenden.
Ob's jedoch ganz richtig ist?

Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
plusplus

Registriert seit: 30. Jul 2010
106 Beiträge
 
Delphi 2009 Architect
 
#6

AW: Indy 10 TIdTCPServer in Thread

  Alt 5. Jan 2011, 21:12
versuche mal das:

1. der tcp server started auch ein thread, so du hast ein thread in einem thread
2. du must den thread blockieren anders wird dein thread list verschoben und es hangt
3. du must erst einen critical section deklarieren
4. dann kanst du den server starten
5. wenn server stopped den critical section wieder beheben.

Critical Section is in SyncObjs unit.

Hoffe das hilft dir weiter

PS: Warum startest du den server in einem thread, der sever ist ja schon ein thread? Ich bin mir sicher das du einen guten grund hast, Ich bin mur neugirig.
Grid Computing made simple - http://xerocoder.com

Geändert von plusplus ( 5. Jan 2011 um 21:17 Uhr)
  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 23:14 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