Einzelnen Beitrag anzeigen

Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: IdTCPServer: RSTerminateThreadTimeout (Terminate Thread

  Alt 17. Nov 2005, 23:17
Hi,

erstmal halte ich Deine Idee, die Indys in ne eigene Klasse auszulagern, nicht unbedingt verkehrt, aber auch nicht zwingend erforderlich !

Habe schon einiges mit den Indys gemacht, teils mit eigenen dynamischen erstellen eigenen Klassen die Indys beinhalten und teils einfach per Drag und Drop der Indy-Komponenten.

Wenn Du den Weg Deiner eigener Klasse weiter gehen möchtest, dann solltest Du es auch richtig machen *lol*
Also wo fang ich an ?

Delphi-Quellcode:
constructor TTCPIP.Create (Owner : TComponent);
begin
  inherited Create (Owner);
  ...
  CreateTCPServer(Owner); // hier auch den Besitzer übergeben
  CreateTCPClient(Owner); // hier auch den Besitzer übergeben
end;


procedure TTCPIP.CreateTCPServer(Owner : TComponent);
begin
  // Dein Code absoluter Schwachsinn, Du erzeugst in Form1 eine Instanz
  // der Klasse TTCPIP und nennst die TCPConnection
  // in Create Deiner eigenen Klasse verweist über Form1,
  // da genau wieder auf die Klasse die Du gerade am erzeugen bist ????
  // Was soll das ?
  //TCPServer := TIdTCPServer.Create (Form1.TCPConnection); // ist das Form1.TCPConnection im Create richtig?
  TCPServer := TIdTCPServer.Create(Owner);
  // oder TCPServer := TIdTCPServer.Create(nil); Server brauch nicht zwingend einen Besitzer
  with TCPServer do
   begin
    OnConnect := TCPServerOnConnect;
    ...
    OnListenException := TCPServerOnListenException;
   end;

  ServerConnected := false;
end;

procedure TTCPIP.CreateTCPClient(Owner : TComponent);
begin
  // Wieder dasselbe wie beim Server, Du bist noch im Create Deiner eigenen Klasse
  // und das Parent/der Besitzer soll über Form1 die Klasse selber seien ???????????
  //TCPClient := TIdTCPClient.Create (Form1.TCPConnection);
  TCPClient := TIdTCPClient.Create(Owner);
  // oder : TCPClient := TIdTCPClient.Create(nil);
 
  with TCPClient do
   begin
    OnConnected := TCPClientOnConnected;
    ...
    OnStatus := TCPClientOnStatus;
   end;
         
  ClientConnected := false;
end;
In Deinen restlichen proceduren könnte das ein oder andere auch noch optimiert/schöner gelöst werden, aber ich bin schreibfaul und die Art der Lösung hängt auch stark davon ab was Du nachher jetzt damit machen willst.
Warum Du Deine Exception bekommst, kann ich Dir sagen(vermute es, bin zu faul es komplett nach zu proggen).
Beim Beenden des Servers werden alle Threads des Servers beendet, d.h. alle Client-Threads UND der Listener-Thread des Servers(der wird nämlich immer erzeugt), und genau dieser lässt sich bei Dir nicht beenden, deshalb die Exception. Den Grund vermute ich in den oben schon beschrieben Fehler(Parentverbiegung).

Hoffe ich konnte Dir weiter helfen, sonst mußte mir mal ne PN schicken.
Mit den Indys kenn ich mich recht gut aus,

Gruß Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat