AGB  ·  Datenschutz  ·  Impressum  







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

Feststellen ob ein Memo immer noch existiert

Ein Thema von dimo · begonnen am 30. Jun 2006 · letzter Beitrag vom 6. Jul 2006
Antwort Antwort
Seite 1 von 2  1 2      
dimo

Registriert seit: 28. Okt 2005
22 Beiträge
 
#1

Feststellen ob ein Memo immer noch existiert

  Alt 30. Jun 2006, 13:26
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Feststellen ob ein Memo immer noch existiert

  Alt 30. Jun 2006, 13:39
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
  Mit Zitat antworten Zitat
dimo

Registriert seit: 28. Okt 2005
22 Beiträge
 
#3

Re: Feststellen ob ein Memo immer noch existiert

  Alt 30. Jun 2006, 13:43
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Feststellen ob ein Memo immer noch existiert

  Alt 30. Jun 2006, 13:51
Übergeb keine Referenz auf das Memo sondern eine Callback-Funktion die aufgerufen wird.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
dimo

Registriert seit: 28. Okt 2005
22 Beiträge
 
#5

Re: Feststellen ob ein Memo immer noch existiert

  Alt 30. Jun 2006, 14:01
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Feststellen ob ein Memo immer noch existiert

  Alt 30. Jun 2006, 14:08
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?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
dimo

Registriert seit: 28. Okt 2005
22 Beiträge
 
#7

Re: Feststellen ob ein Memo immer noch existiert

  Alt 30. Jun 2006, 14:30
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Feststellen ob ein Memo immer noch existiert

  Alt 30. Jun 2006, 14:32
Wie wäre es mit einer Singleton-Managerinstanz in der such sowohl Writer als auch Listener An- + Abmelden.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
dimo

Registriert seit: 28. Okt 2005
22 Beiträge
 
#9

Re: Feststellen ob ein Memo immer noch existiert

  Alt 30. Jun 2006, 14:39
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Feststellen ob ein Memo immer noch existiert

  Alt 6. Jul 2006, 08:16
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:58 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