когда вы завершаете() поток (класс TThread), выходит ли он из каждого дочернего элемента этого потока?
У меня есть код на Delphi, который делает следующее:
procedure THilo.Execute; // (which is the thread)
begin
inherited;
FreeOnTerminate := True;
while not Terminated do
begin
(...)
Sleep(100);
end;
end;
И теперь где-то еще, в другом потоке (или GUI) мы делаем это:
var
Hilo2: THilo;
begin
Hilo2 := THilo.Create(True);
Hilo2.start;
Hilo2 := THilo.Create(True);
Hilo2.start;
end;
Теперь мы выполнили 2 раза один и тот же поток, и они работают параллельно. Что произойдет, если мы сделаем это сейчас?:
Hilo2.Terminate;
Будет ли это завершать оба потока или только 1, или что? кроме того, если бы мы хотели прекратить его, мы могли бы достичь этого путем .Резюме ()?
Заранее спасибо
1 ответ:
При создании второго потока вы перезаписываете локальную переменную
Hilo2
указателем на второй объект - указатель первого объекта теряется, и у вас больше нет никакой ссылки на него (или способа управления им). Это приведет к утечке памяти, если поток не завершит сам себя, и нет, вызов endurate не остановит оба потока, только последний, созданный с этой переменной в качестве ссылки. Кроме того, нет необходимости вызыватьinherited
в методеExecute
TThread - есть ничего не наследуется (метод execute TThread является абстрактным, он ничего не делает).