AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Absturz der Anwendung nach beenden eines Threads
Thema durchsuchen
Ansicht
Themen-Optionen

Absturz der Anwendung nach beenden eines Threads

Ein Thema von Captnemo · begonnen am 19. Jun 2014 · letzter Beitrag vom 20. Jun 2014
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

Absturz der Anwendung nach beenden eines Threads

  Alt 19. Jun 2014, 13:52
Delphi-Version: 5
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
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo

Geändert von Captnemo (19. Jun 2014 um 14:01 Uhr)
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Absturz der Anwendung nach beenden eines Threads

  Alt 19. Jun 2014, 14:11
.. 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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#3

AW: Absturz der Anwendung nach beenden eines Threads

  Alt 19. Jun 2014, 14:19
.. 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.

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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Absturz der Anwendung nach beenden eines Threads

  Alt 19. Jun 2014, 14:23
.. 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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#5

AW: Absturz der Anwendung nach beenden eines Threads

  Alt 19. Jun 2014, 14:31
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#6

AW: Absturz der Anwendung nach beenden eines Threads

  Alt 19. Jun 2014, 14:41
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Absturz der Anwendung nach beenden eines Threads

  Alt 19. Jun 2014, 14:47
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#8

AW: Absturz der Anwendung nach beenden eines Threads

  Alt 19. Jun 2014, 14:52
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Absturz der Anwendung nach beenden eines Threads

  Alt 19. Jun 2014, 14:58
.. vielleicht kann das Ereignis onTerminate des Theads dazu verwendett werden
eine Message zu schicken.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#10

AW: Absturz der Anwendung nach beenden eines Threads

  Alt 19. Jun 2014, 15:06
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?
Michael Justin
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:19 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