AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Problem mit TIdTCPServer, kein sauberes Beenden möglich
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit TIdTCPServer, kein sauberes Beenden möglich

Ein Thema von Tigger · begonnen am 18. Mär 2005 · letzter Beitrag vom 14. Okt 2005
Antwort Antwort
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
Benutzerbild von Tigger
Tigger

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

Re: Problem mit TIdTCPServer, kein sauberes Beenden möglich

  Alt 19. Mär 2005, 16:06
Ist die Frage zu blöd, liest hier am Wochenende keiner
oder gibt es einfache keine Antwort auf die Frage?

Tigger
  Mit Zitat antworten Zitat
Benutzerbild von Tigger
Tigger

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

Re: Problem mit TIdTCPServer, kein sauberes Beenden möglich

  Alt 20. Mär 2005, 17:21
49 Stunden und immer noch keine Antwort....

Ist denn theoretisch richtig, was ich da mache?
Allmählich gehen mir die Ideen aus.

Tigger
  Mit Zitat antworten Zitat
etom291272

Registriert seit: 16. Feb 2004
Ort: ---
232 Beiträge
 
#4

Re: Problem mit TIdTCPServer, kein sauberes Beenden möglich

  Alt 20. Mär 2005, 17:36
bin mir nicht sicher ob ich dir helfen kann aber ich versuchs mal da sonst keiner geschrieben hat.

Habe mir in den letzten tagen mit den indy komponenten einen kleinen lizenzserver gebastelt und bin über einiges gestolpert.

ich verwende einfach folgende codes wenn sich ein client bei mir sind 9999 möglich ausloggt. oder beim beenden des programms funktioniert bei mir einwandfrei ohne exceptions

Delphi-Quellcode:
procedure TFmMain.IdTCPServerDisconnect(AThread: TIdPeerThread);
begin
  AdvSpinEdit1.Value:=AdvSpinEdit1.Value-1;
  StPanLizSrv.Panels[1].Text:=FixtextPan2+inttostr(AdvSpinEdit1.Value);
end;


function TFmMain.StopServer: Boolean;
begin
try
  IdTCPServer.Active := false;
  IdTCPServer.Bindings.Clear;

  Result := not IdTCPServer.Active;

  fServerRunning := result;

  if result then StPanLizSrv.Panels[0].Text:=FixtextPan1+'deaktiviert'
            else StPanLizSrv.Panels[0].Text:=FixtextPan1+'aktiviert';
except
end;
end;
in dem advspinedit speicher ich die gerade aktiven clients und beim schliessen des formulars ruf ich
die stopserver function auf

in der delphi ide kommen exceptions (logisch) wenn ein client einfach abbricht
aber als kompelierte exe gestartet funzt das toll.
  Mit Zitat antworten Zitat
UweR

Registriert seit: 15. Mär 2004
Ort: Bad Marienberg
219 Beiträge
 
Delphi 7 Professional
 
#5

Re: Problem mit TIdTCPServer, kein sauberes Beenden möglich

  Alt 21. Mär 2005, 08:13
Hallo Tigger,

du disconnectest (schönes Wort) eine schon nicht mehr bestehende Verbindung. Schmeiß einfach mal den Disconnect-Befehl raus. Ich denke daran liegts.
Gruß
UweR
  Mit Zitat antworten Zitat
Benutzerbild von Tigger
Tigger

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

Re: Problem mit TIdTCPServer, kein sauberes Beenden möglich

  Alt 22. Mär 2005, 09:12
Zitat:
Schmeiß einfach mal den Disconnect-Befehl raus. Ich denke daran liegts.
Leider nicht... Die Fehlermeldungen bleiben die gleiche, auf beiden Seiten. Außerdem ist die Verbindung ja noch nicht unterbrochen, wenn ich das Server-Programm schließe.

Noch andere Ideen? Bin kurz davor, das Ganze nochmal komplett neu zu machen...

Tigger
  Mit Zitat antworten Zitat
soulflare

Registriert seit: 30. Aug 2005
12 Beiträge
 
#7

Re: Problem mit TIdTCPServer, kein sauberes Beenden möglich

  Alt 14. Okt 2005, 13:15
Ich habe das gleiche Problem. Hast du es irgendwie hingekriegt tigger?
Oder hat jemand anders ne Lösung? Ich verzweifle hier bald.
  Mit Zitat antworten Zitat
Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#8

Re: Problem mit TIdTCPServer, kein sauberes Beenden möglich

  Alt 14. Okt 2005, 13:26
Mal versucht an der TIdTCPServer.TerminateWaitTime zu spielen.
Vielleicht liegt es daran. Erhöhe doch mal auf 10000.
Nur so eine Idee.

Mfg Net7
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Problem mit TIdTCPServer, kein sauberes Beenden möglich

  Alt 14. Okt 2005, 15:29
tja ganz einfach zu erklären
die ondisconnect wird über den clientthread ausgeführt und ist somit multithreaded
wenn du also in dem ondisconnect code steckst, steckst du in einem thread !!!
also 1. mit synchronisations-objekten arbeiten (TCriticalSection z.b.)
und 2. kannst du (weshalb der fehler kommt) dich nicht selbst terminieren *g* so wie im Terminator film
also.. du steckst ja im code eines threads und willst den selbigen beenden -> fehler

der thread wird sowieso selbst beendet und der socket disconnected von den Indys.. also manuelles kicken von solchen verbindungen einfach sein lassen (wenn sie eh schon durch einen fehler zu einem disconnect durch indy führen)
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz