![]() |
AV beim beenden
Hallo DP :hi:
kennt jemand das Problem das beim Beenden eines Progs sporadisch Access-Violations auftreten? Wir ham grad solche Probleme und es nervt, da man teilweise die Progs dann übern TaskMgr killen muss... Da dieses Problem auch relativ selten auftritt läßt es sich nur schwer mit laufenden Debugger reproduzieren. Unser letzter Versuch dies zu beheben war ein Halt() in MainForm.Destroy, jedoch ohne Erfolg... :( Wenn ihr Tipps oder sogar Lösungen anbieten könnt - immer her damit :nerd: Shalom Edit: Ist natürlich Win32.... :oops: |
Re: AV beim beenden
Bei AVs gibt es meiner Erfahrung nach zwei Gründe:
- es wird auf Elemente/Objekte zugrgriffen, die schon längst zerstört sind - es werden bei Programmende nicht alle Objekte wieder sauber freigegeben Hast Du aber Runtime-Errors, dann ist meistens das (nicht eingebundene) ShareMem daran schuld. |
Re: AV beim beenden
Es handelt sich nicht wirklich um eine .Net-Anwendung, oder?
|
Re: AV beim beenden
Zitat:
@Khabarakh: War 'n Verklicker. Ist natürlich Win32. |
Re: AV beim beenden
Mir ist so was früher immer bei Timern passiert. Wenn die sich selber wieder starten dann kann es beim beenden mächtig rappeln.
Schau dir mal den madexcept an, der hat mir da immer geholfen um zu finden wo es passiert |
Re: AV beim beenden
Sobald Du irgendwas mit DLLs machst und parameter übergibst, ist es empfohlen, in allen .dpr die ShareMem als erste Unit einzubinden.
|
Re: AV beim beenden
Zitat:
|
Re: AV beim beenden
Moin Meta777,
ausser den genannten Tips solltest Du in den Projektoptionen auch einmal die Bereichsprüfung aktivieren. Das Problem kann auch auftreten, wenn Grenzen von Arrays überschritten werden. |
Re: AV beim beenden
Hallihallo....
Wir haben nun folgende Lösung umsetzen müssen:
Delphi-Quellcode:
Allerdings gefällt mir diese Lösung nicht wirklich...
function daForceSelfTerminate: Boolean;
//2006_09_14 Code der nach daForceSelfTerminate() steht wird nicht ausgeführ //wenn daForceSelfTerminate() TRUE zurück gibt... var h: Cardinal; begin Result := False; h := OpenProcess(PROCESS_TERMINATE, False, GetCurrentProcessId); if (h <> 0) then Result := TerminateProcess(h, 0); end; Ich habe Bedenken dass es unter älteren Windows-Versionen (Win9x/ME) vielleicht Probleme mit der Speicherbereinigung geben könnte? Unter NT/2K/XP hoffe ich das so etwas nicht der Fall ist. Könntet ihr mir jedoch sagen ob meine Befürchtungen begründet sind oder eher nicht? Vielen Dank Shalom & Gottes Segen :wink: PS: Das Ausschalten der Bereichsprüfung hatte unangenehme folgen, da einige Routinen (unter anderen Hagen's DEC und Zeichenmethoden) nicht mehr liefen... Also haben wir die Bereichprüfung wieder deaktivieren müssen... :? |
Re: AV beim beenden
anstelle von OpenProcess kann man auch gleich GetCurrentProcess nutzen. Aber wie bereits weiter oben erwähnt wird kommen AV's beim beenden in aller Regel zustande weil auf bereits zerstörte Elemente zugegriffen wird. Wenn man zum Beispiel eine Server oder Client-Komponenten hat und im Destroy die Verbindung trennt und dann darauf in Events reagiert kann es schnell zu AV's kommen (wenn man zum Beispiel schon dinge frei gegeben hat welche in einem OnChange angesprochen werden). Auch bei Listviews etc. kommt es schnell mal vor wenn man das OnChange nutzt. Denn wenn das Listview frei gegeben wird und nochmal gecleart wird kommt man in's onChange wo man auf dinge zugreift die zu dem Zeitpunkt wohlmöglich schon zerstört sind.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:19 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