AGB  ·  Datenschutz  ·  Impressum  







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

Frage zu TThread.Free

Ein Thema von iphi · begonnen am 31. Okt 2009 · letzter Beitrag vom 31. Okt 2009
Antwort Antwort
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#1

Frage zu TThread.Free

  Alt 31. Okt 2009, 09:35
Hallo,

ich starte einen Thread wie folgt:

Delphi-Quellcode:
type
  TCapture = class(TThread)
...

var
  Capture: TCapture;
...

Capture := TCapture.Create(...) //1.
...
Capture.Terminate; //2.
...
Capture.Free; //3.
Jetzt der Sachverhalt soweit ich ihn verstehe (bitte um Korrektur, falls ich falsch liege).
-Die Variable Capture ist ja wohl ein Pointer. Vor 1. ist der auf nil gesetzt.
-Bei 1. wird eine TCapture Datenstruktur erzeugt und Capture zeigt dann darauf.
-Bei 2. wird der Thread gestoppt, aber die Datenstruktur lebt noch.

Jetzt meine Frage:
-Bei 3. wird nach meinem Verständnis die Datenstruktur wieder vernichtet, d.h. eigentlich wird nur der entsprechende Speicherplatz wieder als frei deklariert.
Nach Capture.Free sehe ich im Debugger aber immernoch meine Datenstruktur in Capture, d.h. Capture ist in keinster Weise nil. Hat das seine Richtigkeit? Muss ich den selber auf nil setzen, wenn er ungültig ist?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Frage zu TThread.Free

  Alt 31. Okt 2009, 09:43
- Vor 1 ist Capture undefiniert (außer du hast es vorher auf nil gesetzt)
- Nach 3 ist hat Capture immer noch den gleichen Wert wie nach 1 da mit Free nur der Speicher frei gegeben wird. Wie du aber selbst bemerkt hast ist Capture ein Pointer und der zeigt immer noch auf den Speicher der durch Free frei gegeben wurde.

Du kannst aber nach 3 Capture selbst auf nil setzten. Oder du verwendest die Funktion "FreeAndNil"
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#3

Re: Frage zu TThread.Free

  Alt 31. Okt 2009, 09:47
.Free gibt nur das Objekt frei, aber verändert nicht den "Pointer" dieser Zeigt immernoch dahin, wo früher mal das Objekt lag.

Es kommt jetzt drauf an
- entweder du läßt die Variable Capture so, wie sie ist
- oder du setzt es auf nil

PS: dafür gibt es auch die Funktion FreeAndNil
> FreeAndNil(Capture) statt Capture.Free;


Wenn du z.B. später mal abfragen willst, ob da ein Objekt existiert ,
if Assigned(Capture) then dann mußt du es auf nil sezten.
Ansonsten isses eigentlich egal.


Und ob das Objekt (dessen Daten noch angezeigt wird), das hängt teilweise auch vom Speichermanager ab.

Der reserviert bei Windows den Speicher in größeren Blöcken und vergibt ihn in kleineren weiter.
Heißt also, daß dieser Speicher immernoch bei Windows reserviert ist, aber im DelphiMM als "frei" für die weitere Verwendung markiert wurde ... solange bis es überschieben/weitergegeben wird oder auch alles Andere in diesem Block freigegeben wurde und der DelphiMM ihn wieder an Windows zurückgibt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#4

Re: Frage zu TThread.Free

  Alt 31. Okt 2009, 09:56
Ok, danke für die Tipps! Dann liege ich ja nicht ganz falsch.

Zitat:
Vor 1 ist Capture undefiniert (außer du hast es vorher auf nil gesetzt)
Mein Delphi6-Compiler scheint bei Programmstart alle globalen Variablen auf Null bzw. nil zu initialisieren. Gibts dafür einen Compilerschalter? Kann man sich darauf verlassen?

Und:
Wo liegt denn der Unterschied zwischen
if Capture<>nil then ... und

if Assigned(Capture) then ?

Ich habe bisher immer ersteres Konstrukt verwendet, daher auch meine ursprüngliche Frage.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#5

Re: Frage zu TThread.Free

  Alt 31. Okt 2009, 10:30
Einen Unterschied gibt es hier nicht.
Delphi macht im Prinzip auch nur eine Prüfung auf <>nil

Abgesehn bei Eventprozeduren (prozedure of object), denn dieses besteht intern aus 2 Pointern,
weswegen hier eine Prüfung auf <>nil natürlich nicht geht, wärend Assigned dieses prüfen kann.

Also im Endefekt macht sich Assigned da besser, da du dich nicht um Den Typ/Aufbau kümmern mußt
und es überall funktioniert, wo man sowas prüfen möchte.

Zitat von iphi:
Mein Delphi6-Compiler scheint bei Programmstart alle globalen Variablen auf Null bzw. nil zu initialisieren. Gibts dafür einen Compilerschalter? Kann man sich darauf verlassen?
es kommt drauf an, wo diese Variable definiert wurde.
http://www.delphipraxis.net/internal...063919#1063919
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 11:14 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