Цитата:
Сообщение от 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;
|
Спасибо Вы как всегда правы
