Einzelnen Beitrag anzeigen

Benutzerbild von Tigger
Tigger

Registriert seit: 22. Sep 2004
Ort: Wedel
25 Beiträge
 
Delphi 7 Enterprise
 
#1

Problem mit TIdTCPServer, kein sauberes Beenden möglich

  Alt 18. Mär 2005, 16:06
Hallo zusammen!
Ich sitze immer noch an meinem Schiffe-versenken. Habe das Problem, dass sich das Programm nicht sauber beenden läßt.
Ich arbeite mit den Indy-Komponenten, im speziellen geht es hier um den TIdTCPServer.

Wenn der Client die Verbindung unterbricht, wird folgende Prozedur ausgeführt:
Delphi-Quellcode:
procedure Tfrm_main.TCP_ServerDisconnect(AThread: TIdPeerThread);
//******************************************************************************
//Prozedur OnDisconnect. Wird ausgeloest, wenn der Client vom Server getrennt wird
//------------------------------------------------------------------------------
// Schnittstelle
// IN: AThread - TIdPeerThread - Der Thread der Disconnect ausloest
//******************************************************************************
var ThreadList:TList;
begin
    if verbindungSteht then
    begin
       // Verbindung trennen
       sendeSysLog('Verbindung unterbrochen');
       AThread.Connection.Disconnect;
       Statusbar1.Panels[0].Text:= 'Die Verbindung zum Client wurde verloren... (On Disconnect)';
       unterbrochen:= true;
       verbindungSteht:= false;
       PingThread.Suspend;
       TCP_Server.Active := false;
    end;
end;
Beim Deaktivieren des TCP-Servers dauert es einen Moment, dann kommt eine Exception "EIdTerminateThreadTimeout
'Zeitüberschreitung bei Beenden von Thread' ".

Wenn ich den Server schliesse, folgende Prozedur:
Delphi-Quellcode:
procedure Tfrm_main.FormClose(Sender: TObject; var Action: TCloseAction);
//******************************************************************************
// Formular wird geschlossen
//******************************************************************************
var ThreadList:TList;
begin
    sendeSyslog('Formular wird geschlossen');

    try
      if TCP_Server.Active then
        TCP_Server.Active := false;
      if PingThread <> nil then
        PingThread.Terminate;
      ServerSocket.Active := false;
      TCP_Server.ThreadMgr.TerminateThreads;
      SysLog.Active := false;
    except //einfach nur abfangen
    end;

    verbindungSteht:= false;
end; //FormClose
Danach tritt sofort folgende Exception auf: "EIdClosedSocket 'Verbindung aufgehoben' ".

Wenn ich breakpoints setze, wird die Exception wie gesagt immer beim Deaktivieren des TCP-Servers ausgelöst. Nehme ich diese Code-Teile komplett aus dem Programm raus, tritt trotzdem die Exception mit 'Verbindung aufgehoben' auf und zwar beim Beenden des Programms, also direkt nach dem Application.run bei "end.".

Hat jemand so auf Anhieb eine Idee, wo der Hund begraben ist?

Gruß, Tigger
  Mit Zitat antworten Zitat