![]() |
Exception beim Schließen ohne genauen Hintergrund
Guten Abend,
so komisch sich der Thread-Titel anhört, so komisch ist mein Problem auch. Ich habe eine Anwendung mit mehreren Klassen, mehreren Dialogen etc. Nun ist es so, dass ich mir einen ObjektManager erstellt habe, von dem aus alle Objekte erstellt werden, also ein Baum mit einer Instanz des ObjektManager als Wurzel. Wende ich dann am Schluss, d.h. beim OnClose des Programms FreeAndNil(); auf diesen an, wird jedes Objekt brav vernichtet. Seit heute ist es aber so, dass auf einmal eine Exception (Zugriffsverletzung an ...) auftritt, wenn ich das Programm schließe. Natürlich arbeite ich immer weiter an dem Objekt. Allerdings habe ich nur einige kleine Details daran geändert. Wenn die Exception auftritt und ich dann auf Anhalten klicke springt die IDE nicht zu dem Punkt, an dem die Exception auftritt. Ich habe das Problem soweit eingrenzen können, dass ich weiß, dass beim FreeAndNil(); auf eine Form bzw. bei dessen Ausführung, die ich über den ObjektManager erzeugt habe der Fehler auftritt. Ich habe mir zwei Haltepunkte gesetzt. Einen genau auf den Befehl, der nach Ausführung die Exception wirft und einen danach. Drücke ich F9 erscheint die Exception und ich weiß nicht wieso. Vielleicht kennt das Problem jemand? Des Weiteren habe ich probiert dieses FreeAndNil() heraus zu lassen. Sogar mit Erfolg, nur finde ich es total unzufriedenstellend, da es einfach unsauber ist. Unsauber und unschön... Windows holt sich doch zwar den Speicher zu zurück (oder irre ich hier?), aber ich will alles selbst kontrollieren, auch wenn es nur beim Schließen auftritt, an einer Stelle wo es mir egal sein könnte. Mit freundlichen Grüßen der Hai ;) |
Re: Exception beim Schließen ohne genauen Hintergrund
Meine Gedanken:
Möglichkeit 1: ein Objekt wurde bereits freigegeben zu prüfen mit if not (irgendwas=nil) oder if Assigned(irgendwas) then freeandnil(irgendwas); Möglichkeit 2a: ein Timer oder Thread versucht noch auf das Objekt zuzugreifen alle Timer im OncloseQuerry stoppen bzw.Threads terminieren Möglichkeit 2b: eine andere Methobe bzw. Objekt versucht noch auf das Objekt zuzugreifen Lösung nur mit Quellcode möglich,da Glaskugel leider defekt. |
Re: Exception beim Schließen ohne genauen Hintergrund
Zitat:
|
Re: Exception beim Schließen ohne genauen Hintergrund
Das Problem ist aber, wie ich an die Stelle gelange, die den Fehler verursacht. Bisher ist Delphi ja immer an die passende Stelle gesprungen, aber irgendwie tut es da ja nicht. Ich weiß in dem Fall nicht wirklich wie ich eben da hin komme. Über das CPU-Fenster habe ich es auch schon probiert, allerdings gelange ich da nur an die Stelle, an der die Exception geworfen wird. Das hat ja nichts mit meinem Programm zu tun...
Bzgl den Timern: Haltet ihr es sinnvoll einen timerManager einzubauen und eine eigene von TTimer abgeleitete Klasse zu implementieren. Wenn ich dann einen Timer davon erzeuge registriert sich der Timer dann automatisch beim TimerManager. Diese muss ich dann beim Schließen eben noch anweisen eben alle anzuhalten. |
Re: Exception beim Schließen ohne genauen Hintergrund
Vielleicht hast du irgendwo ein Memoryoverlay verursacht. Überprüfe, ob du irgendwo über einen bestimmten Speicherbereich hinaus schreibst.
Beispiel 1:
Delphi-Quellcode:
Beispiel 2:
var
i: integer; arr: array of integer; begin SetLength(arr, 10); for i := 0 to 20 do arr[i] := 0;
Delphi-Quellcode:
var
i: integer; mem: PByte; begin GetMem(mem, 512); for i := 0 to 1024 do begin mem^ := 0; inc(mem); end; |
Re: Exception beim Schließen ohne genauen Hintergrund
Zitat:
|
Re: Exception beim Schließen ohne genauen Hintergrund
Nutzt du irgendwelche speziellen Komponenten ?
|
Re: Exception beim Schließen ohne genauen Hintergrund
Verwendest du selbstdefinierte Interfaces ?
Also etwa so:
Delphi-Quellcode:
TMyObject = class(TPersistent, IMyLogging)
|
Re: Exception beim Schließen ohne genauen Hintergrund
Zitat:
Zitat:
Zitat:
Zitat:
Resumée: Ich denke, dass es an den Timern liegt, werde es allerdings erst heute wieder genauer unter die Lupe nehmen können, d.h. ihr bekommt noch im Laufe des Tages ein Feedback darüber was, wann und wo schief gelaufen ist ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 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 by Thomas Breitkreuz