Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Server beenden Problem bei TIdTCPServer... (https://www.delphipraxis.net/32205-server-beenden-problem-bei-tidtcpserver.html)

Kedariodakon 20. Okt 2004 12:59


Server beenden Problem bei TIdTCPServer...
 
Wenn ich den Server mit:
Delphi-Quellcode:
IdTCPServer.Active := False;
Beende und es sind noch Clients Connectet, bekomm ich immer die Fehlermeldung "Zeitüberschreitung bei Beenden von Thread."

Weshalb das?
Wie kann ich das abstellen?

Bye

Ultimator 20. Okt 2004 13:10

Re: Server beenden Problem bei TIdTCPServer...
 
Ich weiß nicht, wie das bei den Indys ist, aber kann man die User nicht sozusagen "kicken"?
Dann werden automatisch alle Verbindungen gekappt und du kannst disconnecten.

freak4fun 20. Okt 2004 13:27

Re: Server beenden Problem bei TIdTCPServer...
 
hallo,

wenn du controlle über die clients hast (selbst programmiert) schick doch bevor du den server schlließt eine nachricht an die clients das sie sich diconnecten sollen

mfg
freak

(hat inzwischen sein ganzes delphi verschickt :mrgreen: )

Kedariodakon 20. Okt 2004 14:09

Re: Server beenden Problem bei TIdTCPServer...
 
Ich soll ne Liste aller Clients, welche connecteten erstellen, nur um den Server beenden zu können?
Halte ich für eine Resourcenverschwendung, da ich so eine Liste sonst nirgends bei dem Server brauche...

Das muß auch wie anders gehen...

Kann ich irgendwie ohne ne eigene Liste zu erstellen auf alle offenen Verbindungen zugreifen?
So alla Broadcast?

Bye

UweR 20. Okt 2004 14:14

Re: Server beenden Problem bei TIdTCPServer...
 
Hallo Christian,

der Indy-server selbst verwaltet ja schon eine Liste aller Clients bzw. Threads. Da mußt du halt durchlaufen und alle disconnecten. Schau mal bei der Property Threads nach. Das ist genau die Liste die du suchst.

Kedariodakon 20. Okt 2004 15:50

Re: Server beenden Problem bei TIdTCPServer...
 
Threads is a read-only TThreadList property that acts as a container for TIdPeerThread items created in the listener thread.

Sagt die Hilfe...
Aber ich kann dadurch auf kein Thread zugeifen und schon gar nicht ihm einen Befehl geben...

So dann weiteres laut Delphi-Referenz durchsuchenTIdTCPServer.Active
Zitat:

Specifies that the server is running and listening for connections.
Delphi-Quellcode:
property Active: Boolean;
Description

Active is a Boolean property that indicates the current state of the Delphi-Referenz durchsuchenTIdTCPServer.
When Active is True, the server will Delphi-Referenz durchsuchenlisten for client connections, allocate threads and Delphi-Referenz durchsuchensocket handles for connections, and respond to thread execution in the manner prescribed by the Delphi-Referenz durchsuchenTIdTCPServer or descendant. When Active is False, connections and Delphi-Referenz durchsuchensocket handles will be closed, peer threads will be terminated and freed, the thread manager will be released, and the listener thread will be terminated and freed.

Active uses the protected write procedure SetActive to implement changes in the value of the property.
Und warum gibts dann Probleme wenn der das alles macht, wenn ich es auf False setze?
Ich versteh das net...

Hat jemand Rat?

Bye

Motzi 20. Okt 2004 20:06

Re: Server beenden Problem bei TIdTCPServer...
 
Also eigentlich werden alle Verbindungen getrennt wenn man Active auf False setzt. Wichtig dabei ist allerdings, dass jede Verbindung einen eigenen Thread hat und beim Beenden der Verbindung das OnDisconnect-Ereignis im Kontext des Peer-Threads (nicht des MainThreads) ausgeführt wird. Also sollte man in diesem Ereignis keine allzu zeitaufwändigen Sachen machen und aufpassen, dass man keinen Deadlock produziert..!

APALAND 4. Jul 2006 11:15

Re: Server beenden Problem bei TIdTCPServer...
 
Hallo,
versuchs mal mit der folgenden Funktion

function Tform1.stopServer: boolean;
begin
try
idtcpserver.TerminateWaitTime := 1000;
idtcpserver.Bindings.clear;
IdTCPServer.Active := false;
Result := not IdTCPServer.Active;
except
result := false;
end;
end;

ich hatte dies Problem auch, und konnte es erst lösten nachdem ich die TerminateWaitTime gesetzt hatte.


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