Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Beenden von TThreads (https://www.delphipraxis.net/217411-beenden-von-tthreads.html)

Eric Mauch 15 25. Jun 2025 08:12

Beenden von TThreads
 
Hallo Zusammen,

ich habe folgendes Problem.
Ich entwickle aktuell einen Mail-Client der Mails abholt und anzeigt.
Die Aktualisierung der Anzeige läuft dabei in einem eigenen Thread (z.B. neu eingetroffene Mails anzeigen)
Wenn ich jetzt z.B. den Ordner wechsle soll natürlich der Aktualisierungs-Thread davor gestoppt werden.

Theoretisch könnte ich mit WaitFor() arbeiten. Aber ich hätte gerne, dass sich der Thread von selbst wieder freigibt, wenn er fertig ist (FreeOnTerminate).

Weiß zufällig jemand ob es eine Möglichkeit gibt das irgendwie zu kombinieren?

Im voraus schon mal vielen Dank für eure Hilfe.
Liebe Grüße

Der schöne Günther 25. Jun 2025 10:21

AW: Beenden von TThreads
 
Ich bin noch nie gut mit diesem "Fire & Forget"-Ansatz (also FreeOnTerminate = True) gefahren, dass man einen Thread startet, quasi wie "Hier, mach was, vielleicht bist du später noch da, vielleicht nicht. Mir doch egal".

Ich würde entweder einen Thread pro Postfach/Mailbox machen, oder du hast eher etwas vor, was besser in die Philosophie von Tasks passt, das was in der Unit System.Threading liegt. Hast du dir das mal angeschaut?

Natürlich kannst du deinen Thread auch weiterhin auf FreeOnTerminate=True lassen und ihm gleichzeitig (z.B. im Konstruktor) etwas mitgeben, wo der Thread selbst nachschauen kann "Werde ich eigentlich noch gebraucht?". Delphi's Standardbibliothek hat da nichts wirklich fertig, was der Fachmann gerne ein "Cancellation Token" nennt, aber du könntest genauso gut ein normales Event (Unit System.SyncObjs) nehmen. Bei jedem Durchlauf kann der Thread ja schauen ob das "wirSindJetztFertig"-Event bereits ausgelöst wurde, und wenn ja, dann geht er zu Ende.

himitsu 25. Jun 2025 10:53

AW: Beenden von TThreads
 
Du brauchst also was Externes/Gemeinsames, z.B. ein TEvent, aber ambesten als Interface oder in einer synchronisierten Variable.
So kannst'e von außen dem Thread sagen, dass er sich beenden möge. (falls er noch läuft und nicht schon fertig/freigegeben war)

Oder eine externe Liste/Variable, wo reingeschrieben werden kann "Hey Thread, beende dich bitte"
und der Thread schaut regelmäßig da drin nach.

Hobbycoder 25. Jun 2025 12:27

AW: Beenden von TThreads
 
Du könntest auch die Threads in einer TList halten.
Wenn du einen neuen aufmachst, schickst du den alten Threads das Terminate, woraufhin die ihre Events auf nil setzen und die eigenen funktionen beenden, und startest den neuen mit den passenden Events.
Und den OnTerminate-Event kannst du ja nutzen um deine TList sauber zu halten.

Mavarik 25. Jun 2025 13:40

AW: Beenden von TThreads
 
Vielleicht hilft Dir das Video!

Mavarik :coder:

Eric Mauch 15 25. Jun 2025 14:04

AW: Beenden von TThreads
 
Vielen Dank schon mal für die Antworten.

Am Liebsten wäre mir halt wenn ich mir sicher sein kann, dass der Thread jetzt nichts mehr macht.
So will ich z.B. verhindern, dass wildes rumklicken des Benutzers immer mehr neue Threads startet.

Sogesagt ein Neustart des Threads mit anderen Parametern (z.B. anderes Postfach).
Dachte irgendwie nicht, dass das eine so spezielle Anforderung ist, dass es da eine perfekte Lösung gibt ...

Habe es mittlerweile so, dass ich mit im OnTerminate jetzt den Thread in eine Liste speichere und diese bei bestimmten Aktionen bereinige.

Der schöne Günther 25. Jun 2025 14:51

AW: Beenden von TThreads
 
Zitat:

Zitat von Eric Mauch 15 (Beitrag 1549722)
So will ich z.B. verhindern, dass wildes rumklicken des Benutzers immer mehr neue Threads startet.

Bei Gelegenheit solltest du dir wirklich mal Tasks (statt Threads) und den dortigen TThreadPool anschauen. Vielleicht hilft das auch für die Zukunft bei anderen Dingen.

himitsu 25. Jun 2025 16:09

AW: Beenden von TThreads
 
Zitat:

Zitat von Hobbycoder (Beitrag 1549713)
Du könntest auch die Threads in einer TList halten.

Da sich diese Threads selbst freigeben, muß der Zugriff auf die Liste und auch der weitere Zugriff auf den/die Thread(s) abgesichert werden (z.B. CriticalSection).

Die Threads müssen sich ja selbst auf der Liste entfernen, wenn sie sich freigeben.
Und während man sich eine Referenz auf der Liste holt und so lange man mit dieser Thread-Referenz arbeitet, darf sich der Thread auch nicht freigen.


Bezüglich der Syncronisation und den Zugriff ("beende dich"-Befehl) ist es aber auch egal, ob Thread, Task oder Dergleichen.

gubbe 25. Jun 2025 19:53

AW: Beenden von TThreads
 
Wenn Du sicher sein willst, dass der Thread nichts mehr macht, musst Du selbst innerhalb des Threads dafür sorgen, dass er nach einem Terminate nichts mehr macht...

Fragst Du denn im Thread bereits regelmässig ab, ob er sich beenden soll? Normalerweise hat man ja in der Execute-Methode eine Schleife drin, wie "While not Terminated do..." Wenn Du nur einen Thread hast, merkst Du Dir den und rufst Terminate auf. Der Thread wird sich dann beenden, sobald er wieder das "Terminated" abfragt und Du kannst einen neuen starten, ohne dies abzuwarten.

Eine Liste ist aber auch keine schlechte Idee, um beim Beenden des Programms sicherzustellen, dass alle kontrolliert beendet wurden.

jaenicke 29. Jun 2025 15:41

AW: Beenden von TThreads
 
Zitat:

Zitat von Eric Mauch 15 (Beitrag 1549698)
Wenn ich jetzt z.B. den Ordner wechsle soll natürlich der Aktualisierungs-Thread davor gestoppt werden.

Das heißt, wenn der Benutzer zuerst auf Ordner A klickt, dann auf Ordner B und wieder auf A, dann möchtest du alles jedes Mal neu starten? Warum?

Wäre es nicht sinnvoller, wenn du anzeigst, dass da noch ein Thread läuft, den man ggf. manuell abbrechen kann? Es spricht doch nichts dagegen, wenn gleichzeitig mehrere Anfragen laufen, oder?

Die Anzahl der Threads beschränkt sich damit schon einmal auf die Anzahl der Ordner. Zusätzlich kannst du noch eine Maximalanzahl festlegen bzw. konfigurierbar haben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 Uhr.
Seite 1 von 2  1 2      

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