Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ein extern erstellerter Thread kann nicht beendet werden (https://www.delphipraxis.net/172931-ein-extern-erstellerter-thread-kann-nicht-beendet-werden.html)

AJ_Oldendorf 29. Jan 2013 13:14

Ein extern erstellerter Thread kann nicht beendet werden
 
Hallo zusammen,
ich habe eine Anwendung mit sehr vielen Threads. Diese melden sich alle an einem Hauptthread an und wenn die Anwendung beendet wird, geht der Hauptthread seine Liste durch und sagt jedem Thread ".Terminate". Alle "Unterthreads" sind auf "FreeOnTerminate=False" gestellt und der Hauptthread ruft nach dem .Terminate des Unterthreads ein FreeAndNil von dem Unterthread auf. Leider bekomme ich dann die Fehlermeldung:

Ein extern erstellter Thread kann nicht beendet werden

Kann mir hierzu jemand ein Tip geben, wie das kommen kann? Die freizugebenden Thread-IDs passen zu den Thread-IDs die ich auch erstellt habe.
Einige Unterthreads werden durch Komponenten erstellt, welche auf einem Formular liegen.

Danke und Gruß

wicht 29. Jan 2013 15:17

AW: Ein extern erstellerter Thread kann nicht beendet werden
 
Zwischen .Terminate() und FreeAndNil musst du warten, dass die Threads auch beendet worden sind, schätze ich. .Terminate() setzt nur das Terminated-Flag am Thread und beendet den Thread nicht - darum musst du dich selber kümmern, in dem du im Thread auf Terminated prüfst und dann die Execute-Methode verlässt.

Klaus01 29. Jan 2013 15:19

AW: Ein extern erstellerter Thread kann nicht beendet werden
 
.. gibt es in 2009 TThread.WaitFor noch nicht?
Könnte doch auch genutzt werden - oder?

Grüße
Klaus

AJ_Oldendorf 29. Jan 2013 15:46

AW: Ein extern erstellerter Thread kann nicht beendet werden
 
Hallo,
danke, WaitFor kannte ich noch nicht.

Ich habe jetzt eine Schleife, die Terminate aufruft von den Threads.
Dann eine Schleife, welche das WaitFor aufruft.
Und zum Schluss eine Schleife für FreeAndNil.

Dies läuft alles in der Execute Methode von dem Hauptthread.
Jetzt bekomme ich beim beenden aber eine Windows-FehlerMeldung:

Exception EExternalException in Modul ntdll.dll usw...

Hm, irgendwie hat es das noch nicth gebracht oder ich habe was falsch gemacht/verstanden?!

Grüße


Edit:
Mein Fehler. Hatte in einer Komponente auch einen dieser Unterthreads freigegeben. Das habe ich jetzt rausgenommen aber bekomme immernoch die Fehlermeldung wie im Threadtitel beschrieben.
Komisch finde ich auch, dass das WaitFor und das FreeAndNil durchgelaufen sind und dann kommt die Komponente mit dem unterlagerten "Unterthread" ins freigeben und wenn ich mir hier ein Haltepunkt rein mache, ist der Thread <> Nil... Komisch


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