![]() |
Thread beenden, bessere Möglichkeit
Gut also ein "Problem" vor dem ich länger stehe ist, dass ich nicht genau weiß wie ich meinen Thread beenden soll.
Ich erstelle in meiner Anwendung einen Thread mit der VCL-Thread-Klasse TThread. Dann werden dem Thread einige Dinge übergeben und er wird gestartet. Dem benutzer soll nun aber auch die Möglichkeit gegeben werden den Thread zu beenden. Also dachte ich mir ich setz die Eigenschaft Terminated auf true und beende den Thread dann. So jetzt zum eigentlichen Problem. Der Thread führt viele Sachen nacheinander aus, das heißt es ist keine Schleife. Das bedeutet, das ich nach jedem Größeren Abschnitt und/oder in jeder Schleife (kommen welche in einigen Abschnitten vor) prüfen muss ob der Thread "beendet" ist. Meiner Meinung nach ist das ein bisschen viel, nur um einen Thread zu beenden. Aber mir würde spontan nichts anderes einfallen. Zum anderen soll der Thread beendet werden, wenn ein Fehler (Warnung) entsteht, dafür müsste ich auch jedes mal Prüfen, ob bereits ein Fehler (Warnung) enstanden ist oder nicht. Gibt es da noch eine andere Möglichkeit den Thread zu beenden? Ich finde diese Methode nicht besonders effizient und verursacht einiges an zusätzlichem Code. Wenn das bereits die beste Möglichkeit ist, muss ich sie akzeptieren. Ansonsten such ich nach einer anderen. TerminateThread würde ich nicht so gern benutzen weil das einfach eine Vergewaltigung für den Thread ist und wenn ich meine Anwendung beende, bekomm ich meistens AVs und das ist nicht so geschickt. MfG Brainstalker |
Re: Thread beenden, bessere Möglichkeit
Ich glaube nicht, dass du eine bessere Möglichkeit finden wirst, und bzgl. TerminateThread stimme ich dir zu. Das einzige was mir einfallen würde, um den zusätzlichen Code ein bisschen zu beschränken wäre, diesen in eine Extra-Methode auszulagern
Delphi-Quellcode:
Aber darauf bist du vermutlich schon selbst gekommen.
function TMyThread.ShouldTerminate: boolean;
... |
Re: Thread beenden, bessere Möglichkeit
Hab mir schon fast gedacht das eine solche Antwort kommt. Ich muss mich warscheinlich damit abfinden. Ja das mit einer eigenen Funktion zum zusammenfassen ist mir auch bereits in den Sinn gekommen. Das wäre warscheinlich auch noch das vernünftigste. Naja mal sehen, vielleicht schreibt noch jemand was.
Trotzdem vielen Dank! |
Re: Thread beenden, bessere Möglichkeit
if würde auch einfach immer zwischen den einzelnen Abschnitten ein
Delphi-Quellcode:
oder sowas einbauen
if Terminated then
exit; |
Re: Thread beenden, bessere Möglichkeit
Das würde ja dann das Kriterium Fehler/Warnung nicht mitbekommen.
|
Re: Thread beenden, bessere Möglichkeit
Zitat:
Delphi-Quellcode:
procedure TMyThread.ShouldTermiante;
begin bla bla destroy/terminate oder so end; |
Re: Thread beenden, bessere Möglichkeit
Das Problem ist, die Fehler entstehen zwar im Thread, aber ich kann nicht immer sofort darauf reagieren. Der Thread wird dann auch weiter ausgeführt (ja das soll so sein) und die Fehler zum einen in nem Counter gespeichert und auch die Fehlermeldungen mitgeloggt. Der Hauptthread weiß also nicht, das der Thread einen Fehler verursacht hat.
Wenn ich den Thread wegen eines Fehlers beenden will muss das im Thread geschehen. Da werde ich versuchen, sobald ein Fehler entsteht den Thread abzubrechen. Wobei dies warscheinlich nicht direkt möglich ist. Wenn der Thread nun aus dem Mainthread beendet wird, nach dem der Benutzer auf abbrechen geklickt hat, muss ich dem Thread sagen das er beendet werden soll. Kein Problem, aber dann muss ich ja im Thread überprüfen ob er beendet werden soll. Oder kann ich aus dem Hauptthread einfach ne Methode des Threads aufrufen, die dann sofort ausgeführt wird? Eigentlich führt doch der Thread zuerst all seine Aufgaben aus und dann neue. Oder sehe ich das falsch? Wenn das so richtig ist, müsste ich doch trotzdem zwischen den Blöcken bzw. in den Schleifen abfragen. Was ich ja gerade vermeiden will. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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