AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kein Zugriff auf Private Variablen

Ein Thema von Purri · begonnen am 25. Okt 2017 · letzter Beitrag vom 26. Okt 2017
Antwort Antwort
Seite 1 von 2  1 2      
Purri

Registriert seit: 18. Nov 2010
13 Beiträge
 
Delphi XE5 Professional
 
#1

Kein Zugriff auf Private Variablen

  Alt 25. Okt 2017, 10:35
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...

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?
Angehängte Dateien
Dateityp: zip ThreadManager.zip (58,5 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Kein Zugriff auf Private Variablen

  Alt 25. Okt 2017, 10:40
Setze mal einen Haltepunkt bei

Delphi-Quellcode:
procedure TTestThread.RemoveThread;
begin
  gThreadManager.RemoveThread(Self)
end;
und denk mal nach
  Mit Zitat antworten Zitat
Purri

Registriert seit: 18. Nov 2010
13 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Kein Zugriff auf Private Variablen

  Alt 25. Okt 2017, 10:54
Hallo Günther,

ich sehe da leider kein Problem (Außer vll. das fehlende Semikolon, aber das macht keinen Unterschied ).

Wenn ich den Thread alleine beende, also per Klick auf den Thread-Stop-Button, funktioniert übrigens alles, auch das RemoveThread.
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#4

AW: Kein Zugriff auf Private Variablen

  Alt 25. Okt 2017, 11:34
Du übergibst in dem Thread Self an den Threadmanager und versuchst den zu Löschen (Free). Das kann nur schief gehen
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Kein Zugriff auf Private Variablen

  Alt 25. Okt 2017, 11:35
Dein gThreadManager ist zu dem Zeitpunkt schon nil da du vorher schon FreeAndNil(gThreadManager) gemacht hast.
  Mit Zitat antworten Zitat
Purri

Registriert seit: 18. Nov 2010
13 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Kein Zugriff auf Private Variablen

  Alt 25. Okt 2017, 11:45
Ok, ich verstehe was ihr meint, aber nicht warum das so ist.

Ich habe jetzt das FreeAndNil durch
Delphi-Quellcode:
  gThreadManager.Free;
  gThreadManager := nil;
ersetzt. nun klappt es.

Danke.

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**** So isses doch wohl eher NilAndFree

Gibt es einen guten Grund, warum diese Reihenfolge ausgeführt wird?
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#7

AW: Kein Zugriff auf Private Variablen

  Alt 25. Okt 2017, 12:04
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.
  Mit Zitat antworten Zitat
Purri

Registriert seit: 18. Nov 2010
13 Beiträge
 
Delphi XE5 Professional
 
#8

AW: Kein Zugriff auf Private Variablen

  Alt 25. Okt 2017, 12:08
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.
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: Kein Zugriff auf Private Variablen

  Alt 25. Okt 2017, 12:35
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

AW: Kein Zugriff auf Private Variablen

  Alt 25. Okt 2017, 17:26
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
Kommt definitiv immer auf den konkreten Fall an.
  • Geht es um eine Klasseninstanz, die ausschließlich lokal in einer Funktion verwendet (und erstellt) wird, kann man sich das FreeAndNil fast immer sparen und nur Free aufrufen, da die Variable nach dem Verlassen der Funktion eh aus dem Scope läuft/vom Stack entfernt wird.
  • Bei globalen Instanzen kommt es drauf an, ob die Instanz dynamisch (bei bestimmten Aktionen) erstellt und freigegeben wird (und das Vorhandensein über einen <> nil Check umgesetzt wird).

FreeAndNil "nur so" zu verwenden, weil man das Gefühl hat, dann ordentlich aufgeräumt zu haben, ist nur unnötiger Overhead.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 15:10 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