![]() |
Kein Zugriff auf Private Variablen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich bekomme in meiner Testanwendung eine Zugriffsverletzung, die mir nicht ganz klar ist. Hoffentlich kann mir einer von euch sagen, was ich falsch mache...:oops: Ich möchte mir einen Thread-Manager bauen, bei dem sich alle meine Threads registrieren, damit ich diese zentral verwalten kann. Natürlich möchte ich dann auch über den Manager die Threads stoppen und freigeben können. Ich gehe also im Destroy des Threadmanagers meine Liste durch und rufe für laufende Threads ein Free auf, was im Destroy des Threads schlieslich wieder die "RemoveThread"-Routine des Managers aufruft. Und hier kommt das Problem: Dort kann ich plötzlich nicht mehr auf die private Variable des Threadmanagers zugreifen und erhalte eine Zugriffsverletzung :?. Im Anhang findet Ihr die Testanwendung: 1. Threadmanager starten, 2. Thread starten, 3. Threadmanager stoppen -> Fehler Kann mir einer von euch sagen, was ich übersehe/falsch mache? |
AW: Kein Zugriff auf Private Variablen
Setze mal einen Haltepunkt bei
Delphi-Quellcode:
und denk mal nach ;-)
procedure TTestThread.RemoveThread;
begin gThreadManager.RemoveThread(Self) end; |
AW: Kein Zugriff auf Private Variablen
Hallo Günther,
ich sehe da leider kein Problem :oops: (Außer vll. das fehlende Semikolon, aber das macht keinen Unterschied :wink: ). Wenn ich den Thread alleine beende, also per Klick auf den Thread-Stop-Button, funktioniert übrigens alles, auch das RemoveThread. |
AW: Kein Zugriff auf Private Variablen
Du übergibst in dem Thread Self an den Threadmanager und versuchst den zu Löschen (Free). Das kann nur schief gehen :wink:
|
AW: Kein Zugriff auf Private Variablen
Dein
Delphi-Quellcode:
ist zu dem Zeitpunkt schon
gThreadManager
Delphi-Quellcode:
da du vorher schon
nil
Delphi-Quellcode:
gemacht hast.
FreeAndNil(gThreadManager)
|
AW: Kein Zugriff auf Private Variablen
Ok, ich verstehe was ihr meint, aber nicht warum das so ist.
Ich habe jetzt das FreeAndNil durch
Delphi-Quellcode:
ersetzt. nun klappt es.
gThreadManager.Free;
gThreadManager := nil; Danke.:thumb: Zum Verständnis: Ich befinde mich doch eigentlich immer noch im Destructor vom ThreadManager, also dürfte er doch nicht schon weg sein? Ein Blick in den FreeAndNil-Code zeigt: Zuerst wird := nil gesetzt und erst danach .Free aufgerufen.... Ich fühle mich von Delphi verar****:roll: So isses doch wohl eher NilAndFree :lol: Gibt es einen guten Grund, warum diese Reihenfolge ausgeführt wird? |
AW: Kein Zugriff auf Private Variablen
Deine Instanz des ThreadManager existiert zu diesem Zeitpunkt noch. Nur der globale Zeiger "gThreadManager" auf diese Intstanz zeigt bereits auf nil. Zugriffe über nil-Pointer löst Zugriffsverletzung aus.
|
AW: Kein Zugriff auf Private Variablen
Danke Blub,
das habe ich verstanden und schon geändert. Ich frage mich nur noch, warum FreeAndNil zuerst den Zeiger löscht und dann die Instanz, anstatt es andersrum zu machen, wie ja auch der Name es vermuten lässt. |
AW: Kein Zugriff auf Private Variablen
Zu dem Sinn und Unsinn von FreeAndNil gibt es dutzende Diskussionen. Einige sagen, man sollte es oft verwenden, andere nie. Und ich glaube beide haben Recht :lol:
|
AW: Kein Zugriff auf Private Variablen
Zitat:
Delphi-Quellcode:
"nur so" zu verwenden, weil man das Gefühl hat, dann ordentlich aufgeräumt zu haben, ist nur unnötiger Overhead.
FreeAndNil
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 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