MrSaint - Sa 27.09.03 14:27
Titel: TIdTCPServer: "Terminate Thread Timeout"???
Hi!
Ich benutz hier die TIdTCPServer Kompo um Daten auszutauschen. funzt wunderbar, bloß gibt es da irgendwie n Problem: Wenn ein User connected ist (zum laufenden Server) und ich den User wieder disconnecte und dann den Server aus mache (Active:=False) geht alles. wenn ich es aber anders rum mach (Server an -> User connect -> Server aus), dann bekomm ich immer ne "Terminate Thread Timeout" Exeption. Is gleich bei der Indy-Demo (IdTCPDemo). Hab auch schon probiert, alle Clients zuvor per
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| type PClient = ^TClient; TClient = record Username : String[20]; RSAPublic : int64; RSAN : int64; Thread : Pointer; { Pointer to thread } end;
var Clients : TThreadList;
...
var i:integer; RecClient:PClient; AThread:TIdPeerThread;
...
if Clients.LockList.Count>0 then begin try Clients.UnlockList; // is manchmal komischerweise noch ge"lock"t. keine ahnung, warum... except end; with Clients.LockList do begin try for i:=0 to Count-1 do begin RecClient:=Items[i]; AThread:=RecClient.Thread; // AThread.FreeOnTerminate:=True; AThread.Connection.Disconnect; // AThread.Terminate; end; Clear; finally Clients.UnlockList; end; end; end;
...
TCP.Active:=False; // Server ausschalten |
zu disconnecten, aber das bringt au nix... ein "TCPThreadMngr.TerminateThreads;" vor dem "TCP.Active:=False;" bringt au nix.
dann hab ich mich mal über den Indy-Source hergemacht und festgestellt, dass die Funktion "TCPThreadMngr.TerminateThreads;" leer (?!?) ist... weiß nu aber net genau ob das so gewollt is oder was das soll... kann jemand weiterhelfen? THX.
MrSaint
P.S.: Die Exeption ist in Zeile 693 der "IdTCPServer.pas"... Indy v9.00.14...
P.S.2: Die Clients werden vor der Exception alle disconnectet... muss also irgend n anderer Thread sein, der da nicht beendet werden kann :(
MrSaint - So 28.09.03 17:33
also ich hab das nu behoben... is vielleicht nich die sauberste Methode, aber es geht:
Quelltext
1: 2: 3: 4: 5: 6:
| TCP.Threads.Clear; repeat until TCP.Threads.LockList.Count=0; try TCP.Threads.UnlockList; except; end; |
Davor kick ich noch alle Clients (Routine steht oben) und danach kann ich wunderbar meinen TCPServer ausschalten (IdTCCPServer.Active:=False)...
Have much fun!
MrSaint