ВУЗ:
Составители:
Рубрика:
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;
Страницы
- « первая
- ‹ предыдущая
- …
- 5
- 6
- 7
- 8
- 9
- …
- следующая ›
- последняя »