![]() |
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 |
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 |
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.
|
Re: Feststellen ob ein Memo immer noch existiert
Übergeb keine Referenz auf das Memo sondern eine Callback-Funktion die aufgerufen wird.
|
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 |
Re: Feststellen ob ein Memo immer noch existiert
Zitat:
|
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 |
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.
|
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.
|
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 04:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz