![]() |
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 |
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. |
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. |
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. |
AW: Beenden von TThreads
|
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. |
AW: Beenden von TThreads
Zitat:
|
AW: Beenden von TThreads
Zitat:
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. |
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. |
AW: Beenden von TThreads
Zitat:
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. |
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