Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Absturz der Anwendung nach beenden eines Threads (https://www.delphipraxis.net/180808-absturz-der-anwendung-nach-beenden-eines-threads.html)

Captnemo 19. Jun 2014 12:52

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

Klaus01 19. Jun 2014 13:11

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.

MadExcept hast Du schon ausprobiert?

Grüße
Klaus

Captnemo 19. Jun 2014 13:19

AW: Absturz der Anwendung nach beenden eines Threads
 
Zitat:

Zitat von Klaus01 (Beitrag 1262872)
.. 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.

So hatte ich mir das auch gedacht, aber ich war davon ausgegangen, dass mir die IDE dann auch an die Stelle springt, wo die Exception auftritt.

Zitat:

Zitat von Klaus01 (Beitrag 1262872)
MadExcept hast Du schon ausprobiert?

Das müßte ich mir extra kaufen :(

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.

Klaus01 19. Jun 2014 13:23

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

Captnemo 19. Jun 2014 13:31

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.

Uwe Raabe 19. Jun 2014 13:41

AW: Absturz der Anwendung nach beenden eines Threads
 
Zitat:

Zitat von Captnemo (Beitrag 1262873)
Zitat:

Zitat von Klaus01 (Beitrag 1262872)
MadExcept hast Du schon ausprobiert?

Das müßte ich mir extra kaufen :(

Wenn du mit Programmieren Geld verdienst, wie hoch ist dein Stundensatz? Wie viele Stunden müsste dir madExcept ersparen, damit sich die Anschaffung (z.Zt. 159 €) lohnt? Wie lange laborierst du allein an diesem einen Problem schon rum? (Übrigens: you may use the non-commercial edition for 30 days of evaluation).

Für den privaten Gebrauch ist es, wie schon gesagt wurde, kostenlos.

Klaus01 19. Jun 2014 13:47

AW: Absturz der Anwendung nach beenden eines Threads
 
Zitat:

Zitat von Captnemo (Beitrag 1262875)
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?

Wenn ich Threads in einer Objectliste verwalte, dann ist bei den Threads freeOnTerminate bei mir auf false gesetzt.
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

Captnemo 19. Jun 2014 13:52

AW: Absturz der Anwendung nach beenden eines Threads
 
Zitat:

Zitat von Klaus01 (Beitrag 1262879)
Wenn ich Threads in einer Objectliste verwalte, dann ist bei den Threads freeOnTerminate bei mir auf false gesetzt.
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.

Okay, das habe ich verstanden. Das durchsehen der ObjectList muß ich ja irgendwie anstoßen. Finished wir ja sicherlich erst gesetzt, wenn die Execute-Methode verlassen wurde. Demnach macht es keinen Sinn darin per PostMessage das in die Wege zu leiten.
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.

Klaus01 19. Jun 2014 13:58

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

mjustin 19. Jun 2014 14:06

AW: Absturz der Anwendung nach beenden eines Threads
 
Zitat:

Zitat von Captnemo (Beitrag 1262868)
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?

Aus welcher Library stammt TWSocket, ICS? Von ICS wird ein Fensterhandle benutzt. Eventuell besteht hier ein Zusammenhang?
Zur Verwendung von TWSocket in Hintergrundthreads, die Property 'Multithreaded' und Hinweis auf ein Multihtreaded-Beispiel könnte das hier weiterhelfen:

How can I push a TWSocket's OnDataAvailable() event to a background thread in my Delphi 6 application?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr.
Seite 1 von 5  1 23     Letzte »    

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