Показать сообщение отдельно
  #10  
Старый 18.12.2013, 15:00
mustimur mustimur вне форума
Прохожий
 
Регистрация: 20.11.2013
Сообщения: 17
Версия Delphi: Delphi xe4
Репутация: 10
Хорошо

Цитата:
Сообщение от poli-smen
Если же делать "FreeOnTerminate:=True", то так как к такому объекту потока, нельзя обращаться из другого потока - поток должен сам как-то оповестить о своём завершении. Например можно объявить глобальную переменную-счётчик потоков. При создании нового потока увеличивать эту переменную, а каждый поток перед своим завершением должен уменьшать эту переменную (обязательно через Synchronize или InterlockedDecrement), тогда в цикле достаточно просто проверять не достигло ли значение этой переменной нуля:
Код:
var
  NumThr: Integer = 0; // Это будет счётчик запущенных потоков
.....
begin
.....
  for it := 1 to itc do
  begin
    ther[it-1] := Rasch.Create(True);
    Inc(NumThr); // Увеличиваем количество созданных потоков на единицу
    ther[it-1].FreeOnTerminate := True; // Авторазрушаемый объект потока
.....
    ther[it-1].Resume;
  end;

  while NumThr > 0 do Sleep(100); // Ожидаем завершения всех потоков
.....
end;
.....

.....
procedure Rasch.Execute;
begin
  proc(kss, ke);
  InterlockedDecrement(NumThr); // Перед завершением потока уменьшаем количество
                                // запущенных потоков, а объект потока сам разрушится
                                // благодаря FreeOnTerminate := True
end;

Спасибо Вы как всегда правы
Ответить с цитированием