Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi OnDisconnect wird aufgerufen, funktioniert aber nicht immer! (https://www.delphipraxis.net/52138-ondisconnect-wird-aufgerufen-funktioniert-aber-nicht-immer.html)

---Bernhard--- 24. Aug 2005 11:10


OnDisconnect wird aufgerufen, funktioniert aber nicht immer!
 
Hallo

Ich bin dabei eine Server-Client Anwendung zu schreiben (Indy, TCP). Bis jetzt funktioniert alles auch ganz gut, bis auf diesen (kleinen), imho sehr seltsamen Fehler:

In meinem Client habe ich u.A. die Komponenten TIdTCPClient (Indy) und TJvRichEdit (Jedi). Das JvRichedit dient als Log. Am Anfang jeder Zeile setzte ich ein kleine Grafik, damit es etwas übersichtlicher wird.

So, nun zum Problempunkt:
Im OnDisconnected des Clients soll er im JvRichEdit festhalten, dass die Verbindung getrennt wurde. Dies funktioniert prima, jedoch wenn die Verbindung vom Server beendet wird, wird die "OnDisconnected" ausgeführt, es kommt aber beim Einfügen des Image vom Debugger folgende Fehlermeldung:
Delphi-Quellcode:
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Client.exe ist eine Exception der Klasse EOleSysError aufgetreten. Meldung: 'CoInitialize wurde nicht aufgerufen'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
So, für das bessere Verständnis noch etwas Code:
Delphi-Quellcode:
//CLIENT
procedure TForm1.ClientDisconnected(Sender: TObject);
var
  Bitmap: TBitmap;
begin

  Bitmap := TBitmap.Create;
  try
    ImageList.GetBitmap(1, Bitmap);

    try
      // Hier der Fehler: Funktioniert korrekt, es sei den die Verbindung
      // wird _vom Server_ nicht "sauber" beendet!!   
      form1.JvRichEdit1.InsertGraphic(Bitmap, False); // <- Der Fehler!
    finally
      form1.JvRichEdit1.Lines.Add('Verbinung getrennt'); //Geht IMMER !!
    end;

  finally
    Bitmap.Free;
  end;

end;


//SERVER
//Ich benutze diesen Code zum Trennen der Clients
  with Clients.LockList do
  try
    for i := 0 to Count-1 do
    begin
      Client := Items[i];
      ClientThread := Client.Thread;
      ClientThread .Connection.Disconnect;

      Application.ProcessMessages;
    end;
  finally
    Clients.UnlockList;
  end;
Ich kann echt nicht verstehen, dass das Einfügen so herlich funktioniert, es sei denn die Verbindung wird nicht richtig getrennt.
Anscheinend wird in Indy eine Exception durch das unsaubere Trennen ausgelöst, intern verarbeitet und dann das OnDisconnected ausgeführt, jedoch durch die Exception irgendwas nicht initalisiert. Aber warum weiß ich auch nicht, den Indy hat ja nichts mit den Jedis zutun, etc. ... Ich bin ratlos :?

Hoffentlich kann mir jemand helfen!
---Bernhard---

mischerr 24. Aug 2005 20:17

Re: OnDisconnect wird aufgerufen, funktioniert aber nicht im
 
Ich würde mir via PostMessage aus dem OnDisconnect (im Thread-Kontext?) heraus eine Message ans Formular schicken und dann dort den Eintrag tätigen.

Gruss, Michael

---Bernhard--- 24. Aug 2005 20:38

Re: OnDisconnect wird aufgerufen, funktioniert aber nicht im
 
Danke für die Antwort. Ich hab das Problem derzeit mit nem Timer gelöst, dann wird auch eine Meldung ausgelöst, falls OnDisconnected gar nicht auftritt.

Das mit den PostMessages wrd ich mir uach nochmal anschaun, hab mich damit so gut wie noch gar nicht befasst.

Aber warum bzw. wie das Problem auftritt würde mich auch interessieren...


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:30 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