AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zugriffsverletzung nach Objektzerstörung innerhalb Thread
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung nach Objektzerstörung innerhalb Thread

Ein Thema von Pfoto · begonnen am 30. Nov 2006 · letzter Beitrag vom 1. Dez 2006
Antwort Antwort
Pfoto

Registriert seit: 26. Aug 2005
Ort: Daun
541 Beiträge
 
Turbo Delphi für Win32
 
#1

Zugriffsverletzung nach Objektzerstörung innerhalb Thread

  Alt 30. Nov 2006, 18:10
Ok, nachdem ich schon seit längerem an einem wiederkehrenden Fehler hänge, folgende Situation:

1) Ich übergebe einem Thread eine Objektliste
2) Thread holt sich erstes Objekt aus der Liste und tut etwas damit
3) Objekt wird mittels .free anschließend gelöscht
4) Der Thread wird beendet und die Anwendung läuft ohne Probleme weiter
5) Beim Schließen der Anwendung kommt der Crash (Zugriffsverletzung bei Adresse 00000000)

Arbeite ich dieselbe Objektliste ohne Thread durch, entsteht kein Fehler.
Es entseht ebenfalls keine Fehlermeldung, wenn ich dieses Objekt nicht zerstöre - aber es hängt ja noch im Speicher...

Die Objektliste habe ich so erstellt, dass sie nicht selbst die Objekte freigeben soll,
wenn die Liste geleert wird.


Gibt es grundsätzlich Beschränkungen, wenn man ein Objekt innerhalb eines Threads löschen will?
Wahrscheinlich doch nur, hinsichtlich Mehrfachzugriff, oder?

Zugriffsverletzung bei Adresse 00000000 heißt doch, dass ein Objektzeiger bereits auf NIL steht und ich trotzdem darauf zugreifen möchte, oder?


Vielleicht habt ihr ja noch Gedanken dazu, die ihr loswerden wollt,


Folgende Anmerkunge möchte ich noch machen:

Es sind Objekte, die von TObject abgeleitet sind.

Die Objekte, die ich freigeben will, sind wiederum abgeleitet.
Freigegeben wird mit Hilfe des Ursprungsobjektes, also so:
Delphi-Quellcode:
Type
  TElternObjekt = class
  end;
  
  TKindObjekt = class(TElternObjekt)
  end;

 
KindObjekt:= TKindObjekt.Create;

{ ... tue was damit ... }

{ Jetzt freigeben über TElternobjekt }

TElternObjekt(KindObjekt).free;
Aber wenn das nicht gültig wäre, wieso funktioniert es dann ohne Thread-Umgebung?

Dank und Gruß
Pfoto
Jürgen Höfs
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Zugriffsverletzung nach Objektzerstörung innerhalb Threa

  Alt 30. Nov 2006, 18:17
Kurze Frage: Welche Art von Objekten sind das?
Von TComponent abgeleitete welche als Owner ein Formular oder ein anderes Control haben bzw. TControl und Parent gesetzt?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Zugriffsverletzung nach Objektzerstörung innerhalb Threa

  Alt 30. Nov 2006, 20:42
Könnte es sein, dass irgendetwas versucht, das Objekt obwohl schon gelöscht noch einmal freizugeben? Dann solltest du es aus der Liste löschen, nachdem du es freigegeben hast.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Zugriffsverletzung nach Objektzerstörung innerhalb Threa

  Alt 30. Nov 2006, 23:22
Moin Pfoto,

meine erste Frage:

TElternObjekt(KindObjekt).free; Was bezweckst Du denn damit?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Pfoto

Registriert seit: 26. Aug 2005
Ort: Daun
541 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Zugriffsverletzung nach Objektzerstörung innerhalb Threa

  Alt 1. Dez 2006, 09:04
Der Zweck:
Natürlich ist die Sache etwas komplizierter und zieht sich über mehrere Objekte und Units, so dass ich nur exemplarisch etwas Code dargestellt habe.

Grundsätzlich versuche ich das Command-Pattern in Delphi nachzubauen, was ja nicht so schwer ist. Probleme gibt es bei Zerstörung von zuvor weitergegebenen Objekten (bzw. deren Pointern)

Das Pattern besitzt Kenntnisse nur von der Eltern-Klasse, so dass es für die verschiedenen Projekte nicht verändert werden muss.
Ich leite von der Eltern-Klasse im Projekt kann konkrete Kind-Klassen ab und übergebe diese dem Command.
Alles funktioniert bis hier hin. Wenn ich nach der Abarbeitung des Commands im Thread das übergebene Objekt zerstören will, tritt eine Schutzverletzung auf. Eine Zerstörung funktioniert aber wie gesagt grundsätzlich mit der oben erwähnten Vorgehensweise -- nur nicht bei Abarbeitung im Thread.

Gruß
Pfoto
Jürgen Höfs
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Zugriffsverletzung nach Objektzerstörung innerhalb Threa

  Alt 1. Dez 2006, 09:35
1, TElternObjekt(KindObjekt).free; ist völlig unnötig. KindObjekt.Free reicht vollkommen aus.

2, Wenn du das Programm in der IDE beenden läßt, springt die IDE dann nicht an die entsprechende Code-Zeile? Falls nicht, hast du schon mal mit Debug-DCU's gearbeitet? Ansonsten kannst Du mal probieren mit FastMM4 oder MemCheck den Fehler auf den Grund zu gehen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
885 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Zugriffsverletzung nach Objektzerstörung innerhalb Threa

  Alt 1. Dez 2006, 09:48
TList, und somit auch TObjectlist, sind nicht threadsafe. Wenn man solche Listen in Threads verwenden möchte, muss sichergestellt sein, dass wirklich immer nur ein Thread auf diese Liste zugreift! D.h. wenn der Nebenthread mit der Liste arbeitet, darf der Hauptthread nicht auf diese Liste zugreifen. ganz besonders gefährlich sind dabei natürlich Schreibzugriffe (Stichwort: Umkopieren des Zeigerarrays).
Eine Möglichkeit sind TThreadlists. Oder man macht das selbst und arbeitet mit Criticalsections.

Zu dem zerstörten Objekt: Wird das auch aus der Liste entfernt? Hilft es, wenn du nicht nur Free aufrufst, sondern FreeAndNil?
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:39 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