Indy 10 TIdTCPServer in Thread
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:
Komme nicht weiter!?
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; |
AW: Indy 10 TIdTCPServer in Thread
Guten Abend,
Du kannst abfragen ob noch clients verbunden sind. Wenn ja, diese Verbindungen gracefully beenden. Grüße Klaus |
AW: Indy 10 TIdTCPServer in Thread
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.
Delphi-Quellcode:
Wenn dies einmal gemacht wurde kann man den Server nicht mehr beenden.
TIdContext(Active_Client.AContext).Connection.Disconnect
Aber irgendwie muss ich ja Clients von der Server Seite her rausschmeißen können... |
AW: Indy 10 TIdTCPServer in Thread
Delphi-Quellcode:
Wobei hier FServer vom Typ TIdTCPServer ist.
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; Grüße Klaus |
AW: Indy 10 TIdTCPServer in Thread
Danke, aber das CloseGracefully hat nicht funktioniert.
So klappt es:
Delphi-Quellcode:
Also erst Verbindung trennen und dann die Daten per DiscardAll Verwerfen.
TIdContext(Active_Client.AContext).Connection.IOHandler.CloseGracefully;
TIdContext(Active_Client.AContext).Connection.IOHandler.DiscardAll; Es wird dann ganz normal die OnDisconnect aufgerufen und der Server lässt sich beenden. Ob's jedoch ganz richtig ist? :thumb: |
AW: Indy 10 TIdTCPServer in Thread
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. |
AW: Indy 10 TIdTCPServer in Thread
Es ist ein Programm, dass mehrere Protokolle unterstützen soll.
Auch ein UDP Server ist dabei. Diese laufen natürlich parallel. Die Verschidenen Programme laufen dann wieder bei ein paar Funktionen/Datenquellen zusammen. Habe es schon anders versucht, also einfach mit der Komponente auf der MainForm. Da wird aber alles mächtig kompliziert. |
AW: Indy 10 TIdTCPServer in Thread
Nochmal ich!
Jetzt bin ich auf noch ein Problem gestoßen: Der Server läuft und der Client wartet auf Daten:
Delphi-Quellcode:
Nun wird der Server beendet mit
dTCPClient.IOHandler.ReadBytes(Buf, 16, False);
Delphi-Quellcode:
Alles passt, Server kann beendet werden.
if Assigned(fTCP_Server) then
begin if fTCP_Server.Contexts.LockList.Count > 0 then begin for i := fTCP_Server.Contexts.LockList.Count - 1 downto 0 do begin TIdContext(fTCP_Server.Contexts.LockList[i]).Connection.Disconnect; TIdContext(fTCP_Server.Contexts.LockList[i]).Connection.IOHandler.DiscardAll; end; end; fTCP_Server.Contexts.UnlockList; fTCP_Server.Active := false; FreeAndNil(fTCP_Server); end; Wenn nun aber der Client Daten an den Server schickt, egal ob dieser diese Auswertet oder nicht dann kann der Server wieder nicht beendet werden! :evil: Also wenn der Client sowas macht:
Delphi-Quellcode:
Es steht dann wieder beim Active := False;
IdTCPClient.IOHandler.Write(Buf, 16);
|
AW: Indy 10 TIdTCPServer in Thread
Habe die OnExecute des Servers jetzt so umgebaut.
Jetzt haut er den Client wieder raus und der Server kann beendet werden. Mal schauen ob da noch was ist...
Delphi-Quellcode:
Beim Server schließen dürfen auch nicht die einzelenen Verbindungen beendet werden.
procedure TIndeed_Server.OnExecute(AContext: TIdContext);
var Active_Client : TIndeed_Client; begin Active_Client := TIndeed_Client(AContext.Data); while AContext.Connection.Connected do begin if not AContext.Connection.IOHandler.InputBufferIsEmpty then begin if not Terminated then Client_Command_Handler(Active_Client) else AContext.Connection.IOHandler.InputBuffer.Clear; end; AContext.Connection.IOHandler.CheckForDisconnect(False, True); AContext.Connection.CheckForGracefulDisconnect(False); SleepEx(1, true); end; end Sondern einfach nur:
Delphi-Quellcode:
if Assigned(fTCP_Server) then
begin fTCP_Server.Active := false; FreeAndNil(fTCP_Server); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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