Создание многопоточных приложений. Копытин А.В - 7 стр.

UptoLike

Составители: 

7
Завершение работы потока
Объект потока TThread считается законченным, когда завершается выполне-
ние метода Execute. В этом случае вызывается стандартная процедура Delphi
EndThread, которая , в свою очередь, вызывает функцию API ExitThread. Эта
функция должным образом освобождает стек потока и сам потоковый объект
API.
По окончании использования объекта TThread нужно гарантированно раз -
рушить соответствующий объект Delphi. Только в этом случае можно быть
уверенным в корректном освобождении всей памяти , занимаемой этим объек -
том. И хотя это происходит автоматически по завершении процесса, вам , воз-
можно , стоит заняться освобождением объекта несколько раньше, чтобы при -
ложение во время работы не занимало зря память . Простейший способ гаранти -
рованно освободить объект TThread состоит в установке его свойства
FreeOnTerminate равным значению True. Причем это можно сделать в любое
время до завершения выполнения метода Execute. Например, для объекта
TTestThread эта установка может быть выполнена следующим образом:
procedure TTestThread.Execute;
var i: integer;
begin
FreeOnTerminate := True;
for i := 1 to 2000000 do inc(Answer, Round(Abs(Sin(Sqrt(i))));
end;
Объект TThread также имеет событие OnTerminate, которое происходит при
завершении работы потока. Это событие вызывается в контексте основного по -
тока вашего приложения. Последнее означает, что вы можете свободно полу -
чать доступ к свойствам и методам VCL внутри обработчика этого события, не
прибегая к услугам метода Synchronize, o котором пойдет речь в следующем
разделе .
Важно иметь в виду, что метод потока Execute сам несет ответственность за
проверку состояния свойства Terminated для определения необходимости в
досрочном выходе. Эта деталь архитектуры класса гарантирует, что никакая
«нечистая сила» не выдернет коврик из-под ваших ног в самый неподходящий
момент и вы всегда успеете выполнить все необходимые очистительные опера-
ции по окончании работы потока. Такую проверку состояния свойства
Terminated довольно легко добавить в метод Execute объекта TTestThread;
это дополнение выглядит следующим образом:
procedure TTestThread.Execute;
var i: integer;
begin
FreeOnTerminate := True;
for i := 1 to 2000000 do
begin
if Terminated then Break;
inc(Answer, Round(Abs(Sin(Sqrt(i)))));
end;
end;
                                          7
Завершен и е раб от ы п от ока
   О бъ ектпо токаTThread считается зако нченны м, ко гдазаверш ается вы по лне-
ние метода Execute. В этом случае вы зы вается стандартная про цедура Delphi
EndThread, ко т  о рая, в сво ю о чередь, вы зы ваетфункцию API ExitThread. Э та
функция до лж ны м о бразо м о сво бо ж даетстек по тока и сам по токо вы й о бъ ект
API.
   П о о ко нчании испо льзо вания о бъ екта TThread нуж но гарантиро ванно раз-
руш ить со о тветствую щ ий о бъ ектDelphi. Т о лько в этом случае мо ж но бы ть
уверенны м в ко рректно м о сво бо ж дении всей памяти, занимаемо й этим о бъ ек-
том. И х о тя это про исх о дитавтоматически по заверш ении про цесса, вам, во з-
мо ж но , стоитзаняться о сво бо ж дением о бъ екта неско лько раньш е, чтобы при-
ло ж ение во время рабо ты не занимало зря память. П ро стейш ий спо со б гаранти-
ро ванно о сво бо дить о бъ ект TThread со стоит в устано вке его сво йства
FreeOnTerminate равны м значению True. П ричем эт        о мо ж но сделать в лю бо е
время до заверш ения вы по лнения метода Execute. Н апример, для о бъ екта
TTestThread этаустано вкамо ж етбы тьвы по лненаследую щ им о бразо м:
procedure TTestThread.Execute;
var i: integer;
begin
  FreeOnTerminate := True;
  for i := 1 to 2000000 do inc(Answer, Round(Abs(Sin(Sqrt(i))));
end;
  О бъ ектTThread такж е имеетсо бы тие OnTerminate, ко торо е про исх о дитпри
заверш ении рабо ты по тока. Э то со бы тие вы зы вается в ко нтексте о сно вно го по -
тока ваш его прило ж ения. П о следнее о значает, что вы мо ж ете сво бо дно по лу-
чатьдо ступ к сво йствам и методам VCL внутри о брабо тчикаэтого со бы тия, не
прибегая к услугам метода Synchronize, o ко торо м по йдетречь в следую щ ем
разделе.
   В аж но иметьв виду, что метод по токаExecute сам несето тветственно стьза
про верку со стояния сво йства Terminated для о пределения нео бх о димо сти в
до сро чно м вы х о де. Э та деталь арх итектуры класса гарантирует, что никакая
«нечистая сила» не вы дернетко врик из-по д ваш их но г в самы й непо дх о дящ ий
мо менти вы всегдауспеете вы по лнитьвсе нео бх о димы е о чистительны е о пера-
ции по о ко нчании рабо ты по тока. Т акую про верку со стояния сво йства
Terminated до во л    ьно легко до бавить в метод Execute о бъ екта TTestThread;
это до по лнениевы глядитследую щ им о бразо м:
procedure TTestThread.Execute;
var i: integer;
begin
  FreeOnTerminate := True;
  for i := 1 to 2000000 do
  begin
    if Terminated then Break;
    inc(Answer, Round(Abs(Sin(Sqrt(i)))));
  end;
end;