когда вы завершаете() поток (класс 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 5

1 ответ:

При создании второго потока вы перезаписываете локальную переменную Hilo2 указателем на второй объект - указатель первого объекта теряется, и у вас больше нет никакой ссылки на него (или способа управления им). Это приведет к утечке памяти, если поток не завершит сам себя, и нет, вызов endurate не остановит оба потока, только последний, созданный с этой переменной в качестве ссылки. Кроме того, нет необходимости вызывать inherited в методе Execute TThread - есть ничего не наследуется (метод execute TThread является абстрактным, он ничего не делает).