TClientSocket exeption bei delete
-
Hi,
ich nutze in einer Klasse den TClientSocket um TCP Verbindungen aufzubauen.
Im Konstruktor wird der socket initialisiert:
pSocket = new TClientSocket(NULL); pSocket->Active = false; pSocket->ClientType = ctNonBlocking; pSocket->OnConnect = pSocketConnect; pSocket->OnDisconnect = pSocketDisconnect; pSocket->OnError = pSocketError; pSocket->OnRead = pSocketRead;Im Destruktor wird die Instanz gelöscht:
delete pSocket; pSocket = NULL;Wenn irgendein Fehler im Socket passiert (z. B.: Verbindung getrennt), wird die Funktion OnError gerufen. In dieser Funktion wird ein Flag gesetzt, woraufhin ein Task den Socket Schließt und meine Klasse löscht. Danach tritt eine Exeption auf: zugriff auf Adresse 0 nicht erlaubt. (Achso diese Exeption kommt auch nicht sofort meist erst wenn man das Mainform wieder anklickt)
Wenn ich den Socket im Destruktor nicht zerstöre (//delete pSocket) tritt die exeption nicht auf.
Woran könnte das liegen? Und wie kann ich den Socket sonst schließen wenn nicht mit delete.
MfG
-
Das Programm stürzt bei der Behandlung einer Message ab, da er wenn die exeption im Debugger kommt mitten in der Message bearbeitungs Schleife ist.
Ich frag mich jetzt wie kann ich rausfinden was das für eine Message ist?
MfG
-
Hallo Destiniy
versuchs mal auf folgende Weise.
Schätze mal dass beim schliessen der Verbindung im Hintergrund
noch einiges abläuft, danach darfst du erst den Socket deleten.pSocket->Close(); pSocket->Socket->Close(); // z.B. 1000ms warten bis close abgeschlossen ist DWORD now = GetTickCount(); do{ Application->ProcessMessages(); }while( (GetTickCount() - now) < (DWORD)1000 ); delete pSocket;
-
also wenn ich die Messages vorher bearbeite stürzt er dann mitten in dieser Schleife ab.
Genauer:
pSocket->Close(); pSocket->Socket->Close(); DWORD now = GetTickCount(); do{ while (::PeekMessage(&msg,0,0,0,PM_REMOVE)) ::DispatchMessage(&msg); }while( (GetTickCount() - now) < (DWORD)1000 ); delete pSocket; pSocket = NULL;Programm stürzt genau wie vorher nach dem delete irgendwann ab.
-
hat noch jemand eine Idee?
-
Probier mal ein Abort(); vor dem Löschen. Ich bilde mir ein, das mal erfolgreich zum Beenden "hängender" Socketverbindungen eingesetzt zu haben.
-
wie setze ich das Abort() ein, da Abort kein Mitglied der Socketklasse ist?
MfG
-
Hallo,
vielleicht hängt die exeption auch mit meiner Programmstruktur zusammen:
ich habe eine Klasse, die im Konstructor mit new den TClientSocket erstellt und halt im Destruktor mit delete zerstört. Diese Klasse ist in einer Dll genutzt. Die Dll wiederrum wird von der GUI anwendung genutzt.
vielleicht gibt es durch die Dll irgendwelche Probleme?
MfG