Wie beende ich anonyme Threads in Delphi beim Schließen der Anwendung?

7

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.

    
Ivelin Nikolaev 01.05.2012, 17:47
quelle

3 Antworten

14

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:

%Vor%

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.

    
David Heffernan 01.05.2012, 18:31
quelle
8

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.

    
Diego Garcia 10.03.2013 23:54
quelle
3

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.

    
Rob Kennedy 01.05.2012 18:28
quelle