![]() |
Delphi-Version: 5
Absturz der Anwendung nach beenden eines Threads
Hi,
ich habe ein Programm, welches zur Runtime einen, oder mehrere Threads erzeugt. In diesen Thread läuft ein TCP-Client (TWSocket) der eine Verbindung zu einem TCP-Server hält. Wenn nun der TCP-Server sich verabschiedet, schickt er noch ein "Disconnect" rüber, damit sich der Thread mit dem TCP-Client abarbeiten und beenden kann, was er m.E. auch tut. Allerdings habe ich folgendes Phänomen: Wenn sie so ein Thread beendet hat, und ich klicke das Formular der Anwendung an, dann bekomme ich eine Zugriffsverletzung bei 0x00000000: Lesen von Adresse 0x00000000, bzw. System exception (code 0xc000041d) at 0x7702bda1. Auch innerhalb der IDE. Wenn ich aber das Formular nicht anklicke, dann läuft das Programm weiter, erzeugt auch neue Thread, und verbindet sich auch per TCP mit dem Server. Das kann ich x-mal machen, solange ich nicht das Formular der Mainform anklicke. Woher könnte sowas kommen? Wie kann ich feststellen ob der Thread wirklich beendet ist? Ich weiß nicht wirklich wie ich zur Ursache des Problems komme. PS: Oben steht die falsche Delphi-Version. Ist XE4, hab ich zu spät gesehen |
AW: Absturz der Anwendung nach beenden eines Threads
.. aus der Adresse lässt sich schliessen, dass auf eine Object-Instanz zugegriffen wird
die a) noch nicht erstellt wurder oder b) bereits wieder freigegeben wurde. ![]() Grüße Klaus |
AW: Absturz der Anwendung nach beenden eines Threads
Zitat:
Zitat:
Das der Fehler nur auftritt, wenn das Formular den Fokus bekommt, denke ich dass es mit irgendwelchen Fenster-Messaging zusammen hängt. Allerdings ist mir der Zusammenhang zwischen den Fensterbotschaften und den Thread nicht klar. Sicher ist nur, dass ich irgendwo eine Fehler habe. Ich speichere mir die Threads in einer TObjectList. Entfernt sich das Object (der Thread) selber aus dieser Liste wenn er terminiert ist, oder muß ich das selbst machen. Könnte der Fehler vielleicht daher kommen? Zur Zeit verwende ich die TObjectList noch nicht, ist für später vorgesehen. |
AW: Absturz der Anwendung nach beenden eines Threads
.. für den privaten Gebrauch ist madExcept kostenfrei.
Wenn ein Thread in einer TObjectList verwaltet wird terminiert, wird er nicht aus der Objectliste entfernt. Woher soll die Objectliste denn wissen ob ein Eintrag nicht mehr valide ist? Grüße Klaus |
AW: Absturz der Anwendung nach beenden eines Threads
Ich frag jetzt mal ganz blöd:
Wie finde ich den in der TObjectList am sichersten wieder (bzw. er sich selbst) und an welcher Stelle entferne ich ihn aus dieser am besten. Am Ende von der Execute-Methode? Ansonsten müßte ich ihn noch einen Indikator mit auf den Weg geben z.B. ein Handle, worüber ich ihn wiederfinden kann. |
AW: Absturz der Anwendung nach beenden eines Threads
Zitat:
Für den privaten Gebrauch ist es, wie schon gesagt wurde, kostenlos. |
AW: Absturz der Anwendung nach beenden eines Threads
Zitat:
Dann kannst Du durch die Objectliste gehen un die Threads auf finished abfragen. Dann musst Du den Thread freigeben und aus der Liste entfernen. Wenn bei der Objectlist ownsObject = true ist, dann reicht es den Thread aus der Liste zu löschen. Grüße Klaus |
AW: Absturz der Anwendung nach beenden eines Threads
Zitat:
Aber einen Timer dafür erscheint mir auch nicht unbedingt sinnvoll, zu mal der (zumindest in meinem Fall) dann x-mal die Liste durchsieht, und meistens halt nix macht. |
AW: Absturz der Anwendung nach beenden eines Threads
.. vielleicht kann das Ereignis onTerminate des Theads dazu verwendett werden
eine Message zu schicken. Grüße Klaus |
AW: Absturz der Anwendung nach beenden eines Threads
Zitat:
Zur Verwendung von TWSocket in Hintergrundthreads, die Property 'Multithreaded' und Hinweis auf ein Multihtreaded-Beispiel könnte das hier weiterhelfen: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz