Klasse neu erzeugen / überschreiben

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Klasse neu erzeugen / überschreiben

Beitrag von MitjaStachowiak »

Hallo,

ich programmiere gerade eine Lösung, um hängende Threads neu zu starten. Wer meine Frage zu HTTPS gelesen hat, wird verstehen, warum^^ Jedenfalls habe ich eine Klasse, die von TThread erbt, also einen zweiten Thread im Programm betreut. Nun kann es vorkommen, dass sich der Code im zweiten Thread aufhängt. Das kann ich erkennen und die Klasse freigeben. Dann müsste ich eine neue Instanz der Klasse erzeugen, die Parameter übergeben, und weiter geht es.

Die Frage ist jetzt, ob sich die Klasse nicht auch selbst neu erzeugen kann. Auf jeden Fall kann ich eine neue Instanz aus der Klasse heraus erzeugen und die Parameter kopieren. Dann habe ich quasi eine Kopie, jedoch hat diese eine andere Speicheradresse. Wenn sich eine Klasse also selbst freigibt, und der Code, der diese Erzeugt hat, das nicht mitbekommt, dann wird beim Beenden des Programmes weiterhinn Free aufgerufen und es wird ein Exception geben.

Technisch sollte es aber möglich sein, dass die Instanz der neu erzeugten Klasse auf die Speicheradresse der alten Instanz geschoben wird. Das müsste natürlich passieren, bevor das Create der neuen Klasse aufgerufen wird und nachdem Destroy der alten Klasse fertig ist. Jedoch darf nach Destroy der Speicher der alten Klasse nicht freigegeben werden, sondern muss direkt vom Create der neuen Klasse weiterverwendet werden, ohne dass diese sich einen eigenen Speicher reserviert...

Weiß jemand, ob und wie so etwas in Pascal geht?
Oder muss ich die "Aufhängeerkennung" doch außerhalb der Klasse umsetzen?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Klasse neu erzeugen / überschreiben

Beitrag von m.fuchs »

Falls das überhaupt möglich ist, klingt das wirklich nicht nach sauberen Programmdesign. Investier lieber die Zeit um das Problem des Aufhängens deines Threads zu lösen. Das ist nachhaltiger als zu versuchen an die Symptomen zu bekämpfen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

martin_frb
Beiträge: 586
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Klasse neu erzeugen / überschreiben

Beitrag von martin_frb »

Das neue Object ist (oder kann zumindest sein) in beiden Faellen an einer neuen Stelle im Speicher.
Allerdings werden eben nur die Variablen upgedated, die Du auch neu Zuweist.

Zum Verstaendnis:

Code: Alles auswählen

a := TObject.Create,
a ist ein Pointer. Das Object ist irgendwo im Memory. "a" pointed dorthin.

Code: Alles auswählen

 
a := TObject.Create,
b:=a;
 
b ist auch ein pointer, und pointed zu zum selbem memory.
(self ist uebrigens auch ein pointer...)

Code: Alles auswählen

 
a := TObject.Create,
b:=a;
a := TNewObject.Create.
a zeigt auf TNewObject.
b zeigt auf das alte object

Code: Alles auswählen

a := TObject.Create,
b:=a;
FreeAndNil(a)
 
b zeigt auf Speicher, der nicht benutzt wird (oder von etwas anderem genutzt), und zuefaellig ist.

---------------------
Du musst also wenn Du das neue Object erzeugst, auch Die original Variable updaten.

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Klasse neu erzeugen / überschreiben

Beitrag von MitjaStachowiak »

Nun, ich vermute, das Problem mit dem Aufhängen liegt nicht in meinem Code. Könnt ihr ja im anderen Thema nachlesen (http://www.lazarusforum.de/viewtopic.php?f=26&t=7596) :mrgreen:

Anscheinend muss ich noch mal eine weitere Containerklasse schreiben, die das Aufhängen des Threads erkennt und die Klasse neu erzeugt...

Antworten