Entwickler-Ecke

Internet / Netzwerk - TIdTCPServer: "Terminate Thread Timeout"???


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