Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Thread beenden, bessere Möglichkeit (https://www.delphipraxis.net/57666-thread-beenden-bessere-moeglichkeit.html)

Brainstalker 24. Nov 2005 22:04


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

tigerman33 25. Nov 2005 08:24

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:
function TMyThread.ShouldTerminate: boolean;
...
Aber darauf bist du vermutlich schon selbst gekommen.

Brainstalker 25. Nov 2005 14:45

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!

Angel4585 25. Nov 2005 14:53

Re: Thread beenden, bessere Möglichkeit
 
if würde auch einfach immer zwischen den einzelnen Abschnitten ein
Delphi-Quellcode:
if Terminated then
 exit;
oder sowas einbauen

tigerman33 25. Nov 2005 15:00

Re: Thread beenden, bessere Möglichkeit
 
Das würde ja dann das Kriterium Fehler/Warnung nicht mitbekommen.

Angel4585 25. Nov 2005 15:08

Re: Thread beenden, bessere Möglichkeit
 
Zitat:

oder sowas einbauen
Ich meinte damit einfach eine Lösung, in Form einer Abfrage oder einer Prozedur oder so in dem Thread, die anstelle von Terminate aufgerufen wird, die den Fehler/Warnung behandelt und den Thread dann beendet. Diese kann JEDERZEIT von dem Programm aus aufgerufen werden und wird dann denke ich auch sofort ausgeführt.
Delphi-Quellcode:
procedure TMyThread.ShouldTermiante;
begin
bla
bla
destroy/terminate oder so
end;

Brainstalker 25. Nov 2005 15:37

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 19:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz