Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread weiß nicht, dass er terminiert wurde?! (https://www.delphipraxis.net/149806-thread-weiss-nicht-dass-er-terminiert-wurde.html)

WorstNightmare 30. Mär 2010 18:15


Thread weiß nicht, dass er terminiert wurde?!
 
Hallo,

ich habe mal wieder ein Thread Problem :mrgreen:

Damit mein Programm nicht hängt, während eingefügte Links auf ihre Gültigkeit überprüft werden, wird ein Thread gestartet, welcher diese Aufgabe übernimmt.
Seine Funktion an sich erfüllt der Thread sehr gut, allerdings lässt er sich nicht mehr stoppen sobald er am Werk ist :/

Ich versuche so den Thread zu stoppen:
Delphi-Quellcode:
LinkAdder.Terminate;
LinkAdder.WaitFor;
FreeAndNil(LinkAdder);
In der Hauptfunktion des Threads, die durch Execute() aufgerufen wird, läuft eine for-Schleife und bei jedem Link überprüfe ich, ob Terminated wurde. Das Problem ist, dass obwohl von außen Terminate aufgerufen wurde, ist Terminated im Thread, wenn ich es mir ausgeben lasse, noch False. Daher stoppt er nicht.

Weiß jemand woran das liegt und wie man es lösen könnte?

Sir Rufo 30. Mär 2010 18:34

Re: Thread weiß nicht, dass er terminiert wurde?!
 
Vielleicht zeigt LinkAdder nicht auf den richtigen Thread?
Delphi-Quellcode:
while not LinkAdder.Terminated do
  LinkAdder.Terminate;
LinkAdder.WaitFor; // <-- Hier Breakpoint setzen und dann im Thread prüfen
FreeAndNil(LinkAdder);

thkerkmann 30. Mär 2010 18:40

Re: Thread weiß nicht, dass er terminiert wurde?!
 
Hi,

thread.terminate setzt nur ein Flag, ein while ist hier überflüssig.

ich würde mir gerne mal die Execute anschauen. Wahrscheinlich kommt die gar nicht zu der Abfrage des Flags.
Normalerweise hat man ja keine For Schleife im Thread sondern eine While Schleife:
Delphi-Quellcode:
   while not Terminated do
   begin
     // werkeln
   end;
Gruss

WorstNightmare 30. Mär 2010 19:09

Re: Thread weiß nicht, dass er terminiert wurde?!
 
Zitat:

Zitat von Sir Rufo
Vielleicht zeigt LinkAdder nicht auf den richtigen Thread?

Jetzt wo du es sagst, stimmt.
Ich habe mir mal die ThreadID ausgeben lassen:
Nach dem der Thread suspendiert erstellt wurde und .Start; aufgerufen wurde, ist sie 5012.
In der von Execute aufgerufen Methode ist sie 7700 - beim Beenden jedoch wieder 5012.

Erstellt der Thread automatisch noch einen anderen oder warum ist das so? :shock:

thkerkmann 30. Mär 2010 19:15

Re: Thread weiß nicht, dass er terminiert wurde?!
 
Hi,

das ist aber nicht normal.....
Zeig uns doch mal deine Execute Methode.

WorstNightmare 30. Mär 2010 19:36

Re: Thread weiß nicht, dass er terminiert wurde?!
 
Ah ich habs.
Hatte die ganze Zeit gekuckt, ob irgendwo auf LinkAdder zugegriffen wird.
Allerdings wird in dem Teil, in dem die Links aus einer Datei geladen werden, schon ein Thread erstellt und dann eben noch einmal der "normale".

Klaus01 30. Mär 2010 20:16

Re: Thread weiß nicht, dass er terminiert wurde?!
 
.. ist die execute Methode so geheim, dass Du sie nicht zeigen darfst?

Grüße
Klaus

Sir Rufo 30. Mär 2010 23:00

Re: Thread weiß nicht, dass er terminiert wurde?!
 
Zitat:

Zitat von Klaus01
.. ist die execute Methode so geheim, dass Du sie nicht zeigen darfst?

Grüße
Klaus

so geheim, er müsste uns schon erschiessen, wenn er nur drüber nachdenkt diese zu zeigen :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:37 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