AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Beenden von TThreads

Offene Frage von "TomyN"
Ein Thema von Eric Mauch 15 · begonnen am 25. Jun 2025 · letzter Beitrag vom 29. Jun 2025
Antwort Antwort
Seite 1 von 2  1 2      
Eric Mauch 15

Registriert seit: 25. Jun 2025
6 Beiträge
 
#1

Beenden von TThreads

  Alt 25. Jun 2025, 08:12
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
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.208 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Beenden von TThreads

  Alt 25. Jun 2025, 10:21
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.468 Beiträge
 
Delphi 12 Athens
 
#3

AW: Beenden von TThreads

  Alt 25. Jun 2025, 10:53
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.015 Beiträge
 
#4

AW: Beenden von TThreads

  Alt 25. Jun 2025, 12:27
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.159 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Beenden von TThreads

  Alt 25. Jun 2025, 13:40
Vielleicht hilft Dir das Video!

Mavarik
  Mit Zitat antworten Zitat
Eric Mauch 15

Registriert seit: 25. Jun 2025
6 Beiträge
 
#6

AW: Beenden von TThreads

  Alt 25. Jun 2025, 14:04
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.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.208 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Beenden von TThreads

  Alt 25. Jun 2025, 14:51
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.468 Beiträge
 
Delphi 12 Athens
 
#8

AW: Beenden von TThreads

  Alt 25. Jun 2025, 16:09
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
172 Beiträge
 
Delphi 12 Athens
 
#9

AW: Beenden von TThreads

  Alt 25. Jun 2025, 19:53
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.020 Beiträge
 
Delphi 12 Athens
 
#10

AW: Beenden von TThreads

  Alt 29. Jun 2025, 15:41
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:15 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