Einzelnen Beitrag anzeigen

Benutzerbild von ---Bernhard---
---Bernhard---

Registriert seit: 26. Dez 2003
Ort: Abensberg
111 Beiträge
 
Delphi 2006 Professional
 
#1

OnDisconnect wird aufgerufen, funktioniert aber nicht immer!

  Alt 24. Aug 2005, 12:10
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---
Bernhard Doll
Das Leben ist ein sch*** Spiel... aber eine super Grafik!!
http://www.doll-online.net
  Mit Zitat antworten Zitat