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