Ich habe eine Delphi-Anwendung, die bei einem TTimer.OnTimer-Ereignis 6 anonyme Threads hervorbringt.
Wenn ich die Anwendung über die X-Schaltfläche in der Titelleiste schließen, wird die Zugriffsverletzung bei der Adresse $ C0000005 ausgelöst und FastMM meldet durchgelaufene TAnonymousThread-Objekte.
Was ist die beste Methode, um anonyme Threads in Delphi zu löschen, die im OnTimer-Ereignis mit der TThread.CreateAnonymousThread () -Methode erstellt wurden?
LÖSUNG, die für mich funktioniert hat:
Erstellt einen Wrapper der anonymen Threads, der sie beim Freigeben beendet.
%Vor%Ende hier ist, wie Sie es nennen können:
%Vor%Kein Speicherleck, ordnungsgemäßes Herunterfahren und einfach zu bedienen.
Wenn Sie die Lebensdauer eines Threads beibehalten und kontrollieren möchten, muss FreeOnTerminate
auf False
gesetzt sein. Andernfalls ist es ein Fehler, nach der Ausführung des Threads auf den Thread zu verweisen. Das liegt daran, dass Sie nach der Ausführung nicht mehr wissen können, ob es freigegeben wurde oder nicht.
Der Aufruf von CreateAnonymousThread
erstellt einen Thread, für den FreeOnTerminate
festgelegt ist %Code%.
Der Thread ist auch als FreeOnTerminate markiert. Daher sollten Sie die zurückgegebene Instanz nach dem Aufruf von Start nicht berühren.
Und so, aber Standard, Sie sind nicht in der Lage, Kontrolle über die Lebensdauer des Threads auszuüben. Sie können jedoch True
auf FreeOnTerminate
unmittelbar vor dem Aufruf von False
setzen. So:
Aber ich bin mir nicht sicher, ob ich das tun würde. Das Design von Start
ist, dass der Thread bei Beendigung automatisch freigegeben wird. Ich denke, ich persönlich würde entweder dem beabsichtigten Entwurf folgen oder meinen eigenen CreateAnonymousThread
Abkömmling ableiten.
Um Fehler mit CreateAnonymousThread
zu vermeiden, setzen Sie FreeOnTerminate
auf False
, bevor Sie es starten.
Auf diese Weise können Sie mit dem Thread arbeiten, wie Sie es normalerweise ohne Umgehung tun.
Sie können die Dokumentation lesen, die besagt, dass CreateAnonymousThread
automatisch FreeOnTerminate
auf True
setzt und dies die Fehler verursacht, wenn Sie auf den Thread verweisen.
Sorge dafür, dass deine Threads von außen auf irgendeine Art von Benachrichtigung achten. Dies kann ein Ereignis sein, das signalisiert wird, eine Nachricht, die an ein Fenster gesendet wird, das dem Thread gehört, ein Befehl, der über einen Socket gesendet wird, den Ihr Thread überwacht, oder jede andere Art von Kommunikation, die Sie finden.
Wenn Sie feststellen, dass dieses Problem darauf zurückzuführen ist, dass es sich bei Ihren Threads um sogenannte "anonyme" Threads handelt, besteht eine einfache Problemumgehung darin, dass Sie sie zu nicht anonymen Threads machen. Fügen Sie den Körper der anonymen Funktion in die Methode Execute
ein und übergeben Sie alle erfassten Variablen über ihren Konstruktor an die Thread-Klasse.
Tags und Links multithreading delphi delphi-xe2 terminate anonymous