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?
Klasse neu erzeugen / überschreiben
-
- Lazarusforum e. V.
- Beiträge: 395
- Registriert: Sa 15. Mai 2010, 13:46
- CPU-Target: 64 bit
- Kontaktdaten:
- 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
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
-
- 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
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:
a ist ein Pointer. Das Object ist irgendwo im Memory. "a" pointed dorthin.
b ist auch ein pointer, und pointed zu zum selbem memory.
(self ist uebrigens auch ein pointer...)
a zeigt auf TNewObject.
b zeigt auf das alte object
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.
Allerdings werden eben nur die Variablen upgedated, die Du auch neu Zuweist.
Zum Verstaendnis:
Code: Alles auswählen
a := TObject.Create,
Code: Alles auswählen
a := TObject.Create,
b:=a;
(self ist uebrigens auch ein pointer...)
Code: Alles auswählen
a := TObject.Create,
b:=a;
a := TNewObject.Create.
b zeigt auf das alte object
Code: Alles auswählen
a := TObject.Create,
b:=a;
FreeAndNil(a)
---------------------
Du musst also wenn Du das neue Object erzeugst, auch Die original Variable updaten.
-
- Lazarusforum e. V.
- Beiträge: 395
- Registriert: Sa 15. Mai 2010, 13:46
- CPU-Target: 64 bit
- Kontaktdaten:
Re: Klasse neu erzeugen / überschreiben
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)
Anscheinend muss ich noch mal eine weitere Containerklasse schreiben, die das Aufhängen des Threads erkennt und die Klasse neu erzeugt...

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