2013-05-21 11 views
5

Ich habe einen Code in Delphi, die folgende tut:Wenn Sie einen Thread (Klasse TThread) beenden(), beendet es jedes Kind dieses Threads?

procedure THilo.Execute; // (which is the thread) 
begin 
    inherited; 
    FreeOnTerminate := True; 
    while not Terminated do 
    begin 
    (...) 
    Sleep(100); 
    end; 
end; 

und woanders jetzt, in einem anderen Thread (oder die GUI) wir dies tun:

var 
    Hilo2: THilo; 
begin 
    Hilo2 := THilo.Create(True); 
    Hilo2.start; 
    Hilo2 := THilo.Create(True); 
    Hilo2.start; 
end; 

jetzt haben wir 2 mal ausgeführt der gleiche Thread, und sie laufen parallel. Was passiert, wenn wir das jetzt tun ?:

Hilo2.Terminate; 

wird dies beendet beide Threads oder nur 1, oder was? auch, wenn wir es beenden möchten, könnten wir dies durch .Resume() erreichen?

Vielen Dank im Voraus

Antwort

8

Wenn Sie den zweiten Thread erstellen Sie die lokalen Variable überschreiben Hilo2 mit einem Zeiger auf das zweite Objekt - das Zeiger ersten Objekts verloren geht und Sie nicht mehr über einen Hinweis auf sie (oder Weg um es zu kontrollieren). Dies führt zu einem Speicherverlust, wenn der Thread sich nicht selbst beendet, und nein, das Aufrufen beendet beendet nicht beide Threads, nur das letzte, das mit dieser Variablen als Referenz erstellt wurde. Außerdem ist es nicht notwendig, inherited in der Execute-Methode eines TThread aufzurufen - es gibt nichts zu erben (TThreads execute-Methode ist abstrakt, sie tut nichts).

+0

Dank J, hatte ich in meinem Programm dies und konnte die Threads nicht beenden, so würde es nur mit einem Array eines TThread behoben werden, oder? wie 'Hilo [i]: = THilo.Create (True); Hilo [i] .start; ' – user2308704

+1

Oh - ein weiterer erfahrener Delphi Multithread-Entwickler. Das macht mindestens zwei von uns :) –

+3

Auch, da 'FreeOnTerminate = True' verwendet wird, wenn der Thread vorzeitig beendet wird (nicht abgefangene Exception, etc), kann der Aufruf von' Terminate() 'fehlschlagen (oder schlimmer, der Speicher wird beschädigt) wenn der Thread schon weg ist. 'FreeOnTerminate = True' sollte nur für Create-and-Forget-Threads verwendet werden. Sobald Sie einen Thread für ** irgendeinen ** Grund extern berühren müssen (aussetzen/fortsetzen, beenden/warten, Aktualisierungen/Zugriffe auf Mitglieder, etc.), verwenden Sie nicht 'FreeOnTerminate = True'! –