Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Feststellen ob ein Memo immer noch existiert (https://www.delphipraxis.net/72462-feststellen-ob-ein-memo-immer-noch-existiert.html)

dimo 30. Jun 2006 13:26


Feststellen ob ein Memo immer noch existiert
 
Hallo,

ich habe einen Thread der beim Erzeugen einen Zeiger auf ein Memo-Feld bekommt. Diese schreibt (über synchronized natürlich) ab und zu Zeilen ins Memo-Feld. Alles bestens, bis aus irgendeinem Grund das Memo-Feld freigegeben wird (z.B. Programm wird beendet). Dann stürzt der Thread ab. Assigned kann man leider nicht verwenden. Meine Lösung jetzt ist, beim Erzeugen auch das Handle vom Memo-Feld abzuspeichern und vor dem Versuch mit dem Memo-Feld zu arbeiten, mache ich ein GetParent(FHandle). Wenn das 0 zurückgibt (da das Memo-Feld freigegeben worden ist und sein Handle nicht mehr existiert) weiss ich dass es weg ist. Gibt es eine bessere Möglichkeit (Observer-Pattern wäre wahrscheinlich optimal)?

Grüße,
Dimo

marabu 30. Jun 2006 13:39

Re: Feststellen ob ein Memo immer noch existiert
 
Hallo,

du denkst vielleicht zu kompliziert. Wenn du die Memo-Komponente erzeugst, bevor du sie dem thread übergibst, dann beende den thread zuerst und zerstöre die Memo-Komponente erst dann.

Grüße vom marabu

dimo 30. Jun 2006 13:43

Re: Feststellen ob ein Memo immer noch existiert
 
Das geht in meinem Fall nicht. Ich habe kein Zeiger auf den Thread und dazu muss ich auch noch warten bis der Thread beendet ist usw.

Bernhard Geyer 30. Jun 2006 13:51

Re: Feststellen ob ein Memo immer noch existiert
 
Übergeb keine Referenz auf das Memo sondern eine Callback-Funktion die aufgerufen wird.

dimo 30. Jun 2006 14:01

Re: Feststellen ob ein Memo immer noch existiert
 
Hallo Bernhard,
Das wäre vielleicht eine Möglichkeit, ABER ich kann entweder normale Prozedur übergeben oder procedure of object.
1. Fall - die Prozedur greift auf derselben weise auf das Memofeld zu, sie wird also genauso abstürzen
2. Fall - die Prozedur ist eine Methode eines Objekts. Was passiert wenn dieses Objekt schon freigegeben worden ist?
Gruß,
Dimo

Bernhard Geyer 30. Jun 2006 14:08

Re: Feststellen ob ein Memo immer noch existiert
 
Zitat:

Zitat von dimo
2. Fall - die Prozedur ist eine Methode eines Objekts. Was passiert wenn dieses Objekt schon freigegeben worden ist?

Dann ist dein Thread "freischwebend". Oder wird dein Thread von einem Objekt erzeugt welches vor Ende des Threads freigegeben wird?

dimo 30. Jun 2006 14:30

Re: Feststellen ob ein Memo immer noch existiert
 
Ja, richtig. Es handelt sich um einen Protokollierungsthread. Es gibt 1 Stück pro Anwendung. Eine der möglichen LogAusgaben (Appenders in Log4J-Terminologie) ist in einem Memo-Feld. Es kann gut sein, dass man im Programm ein Fenster aufmacht auf dem ein Memofeld drin ist, wo dann irgendwelche Lognachrichten anzeigt werden. Irgendwann wird dieses Fenster freigegeben und das Memofeld damit auch. Dann ist eine dieser Logausgaben fällig... Da es sich um parallele Abläufe handelt, ist es sehr schwer zu garantieren, dass dieser Thread rechtzeitig darüber informiert wird, dass das Memofeld weg ist. Dazu noch - der Benutzer von meiner Protokollierungsimplementation müsste nie vergessen den Thread zu informieren, was natürlich zu viel zu verlangen ist. Darum brauche ich unbedingt eine Möglichkeit im Thread selbst festzustellen, ob das Memo da ist oder schon weg ist. Mein Workaround funktioniert jetzt schon, würde aber gern eine unkompliziertere (verständlichere) Möglichkeit finden

Dimo

Bernhard Geyer 30. Jun 2006 14:32

Re: Feststellen ob ein Memo immer noch existiert
 
Wie wäre es mit einer Singleton-Managerinstanz in der such sowohl Writer als auch Listener An- + Abmelden.

dimo 30. Jun 2006 14:39

Re: Feststellen ob ein Memo immer noch existiert
 
Das gibt es schon :-). Es bleibt aber immer noch, dass der Benutzer oft vergisst im OnDestroy sich abzumelden und das Programm stürzt ab - dies will ich auf jeden Fall vermeiden. BTW eine Frage über Singleton-Pattern in Delphi habe ich auch gepostet.

marabu 6. Jul 2006 08:16

Re: Feststellen ob ein Memo immer noch existiert
 
Hallo,

ich kann zwar immer noch nicht erkennen, warum die normale Aquire-Release Strategie nicht greifen kann, aber zur Not geht es auch so: der thread isoliert das handle h des Memos und prüft vor Zugriffen mit IsWindow(h), ob er noch auf die Komponente zugreifen kann.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:08 Uhr.
Seite 1 von 2  1 2      

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