ВУЗ:
Составители:
Рубрика:
6
inc(Answer,Round(Abs(Sin(Sqrt(i)))));
end;
Единственная цель этих вычислений – затратить как можно больше времени
на их выполнение.
Теперь можно выполнить этот пример потока путем вызова конструктора
Create. Пока это реализуется с помощью щелчка на кнопке главной формы , как
показано в следующем фрагменте программы (во избежание ошибок компиля -
тора не забудьте включить модуль , содержащий объект TTestThread, в инст-
рукцию uses модуля TForm1):
procedure TForml.ButtonlClick(Sender: TObject);
var NewThread: TTestThread;
begin
NewThread := TTestThread.Create(False);
end;
Если запустить приложение и щелкнуть на кнопке, то вы заметите , что може-
те по - прежнему работать с формой, перемещая ее или меняя ее размеры на фо -
не выполнения упомянутых вычислений.
Единственный логический параметр , который передается в конструктор
Create класса TThread, называется CreateSuspended и показывает, начинать
ли поток в приостановленном состоянии. Если этот параметр равен False, ме-
тод Execute этого объекта будет автоматически вызван без промедления. Если
этот параметр равен True, то для действительного начала работы потока в оп-
ределенной точке приложения нужно воспользоваться методом Resume, кото -
рый приведет к вызову метода Execute. Обычно параметр CreateSuspended
устанавливается равным True в случае, когда перед работой потока нужно ус-
тановить дополнительные свойства для потокового объекта . Установка же
свойств после запуска потока может привести к возникновению проблем .
Экземпляры потока
Возвращаясь к методу Execute объекта TTestThread, обратите внимание на
то , что он содержит локальную переменную i. Рассмотрим, что произойдет с
переменной i, если создать два экземпляра объекта TTestThread. Может ли
значение этой переменной для одного потока перезаписать значение одноимен-
ной переменной для другого ? Имеет ли первый поток преимущество перед вто -
рым? Происходит ли в этом случае разрушение потока? Ответы на все три во -
проса одинаковы : нет, нет и нет. Win32 поддерживает для каждого работающе-
го в системе потока отдельный стек . Это значит, что при создании нескольких
экземпляров объекта TTestThread каждый имеет собственную копию перемен -
ной i в своем собственном стеке. Следовательно , в этом отношении все потоки
будут действовать независимо друг от друга.
Однако необходимо заметить , что понятие «одной и той же» переменной (ко -
торая в своем потоке действует независимо от коллег ) отнюдь не переносится
на глобальные переменные.
6 inc(Answer,Round(Abs(Sin(Sqrt(i))))); end; Е динственная цель этих вы числений – затратить как мо ж но бо льш е времени наих вы по лнение. Т еперь мо ж но вы по лнить этотпример по тока путем вы зо ва ко нструктора Create. П о каэт о реализуется спо мо щ ью щ елчканакно пкеглавно й фо рмы , как по казано в следую щ ем фрагменте про граммы (во избеж ание о ш ибо к ко мпиля- тора не забудьте вклю чить мо дуль, со держ ащ ий о бъ ектTTestThread, в инст- рукцию uses мо дуля TForm1): procedure TForml.ButtonlClick(Sender: TObject); var NewThread: TTestThread; begin NewThread := TTestThread.Create(False); end; Е сли запуститьприло ж ение и щ елкнутьнакно пке, то вы заметите, что мо ж е- те по -преж нему рабо татьсфо рмо й, перемещ ая ее или меняя ее размеры нафо - невы по лнения упо мянуты х вы числений. Е динственны й ло гический параметр, ко торы й передается в ко нструктор Create кл асса TThread, назы вается CreateSuspended и по казы вает, начинать ли по ток в прио стано вленно м со стоянии. Е сли этотпараметр равен False, ме- тод Execute этого о бъ ектабудетавтоматически вы зван без про медления. Е сли этотпараметр равен True, то для действительно го начала рабо ты по тока в о п- ределенно й точке прило ж ения нуж но во спо льзо ваться методо м Resume, ко т о- ры й приведетк вы зо ву метода Execute. О бы чно параметр CreateSuspended устанавливается равны м True в случае, ко гда перед рабо той по тока нуж но ус- тано вить до по лнительны е сво йства для по токо во го о бъ екта. У стано вка ж е сво йствпо слезапускапо токамо ж етпривести к во зникно вению про блем. Экзем п ляры п от ока В о звращ аясь к методу Execute о бъ екта TTestThread, о братите внимание на то, что о н со держ итло кальную переменную i. Рассмо трим, что про изо йдетс переменно й i, если со здать два экземпляра о бъ екта TTestThread. М о ж етли значение этой переменно й для о дно го по токаперезаписатьзначение о дно имен- но й переменно й для друго го ? И меетли первы й по ток преимущ ество перед вто- ры м? П ро исх о дитли в этом случае разруш ение по тока? О тветы на все три во - про сао динако вы : нет, нети нет. Win32 по ддерж иваетдля каж до го рабо таю щ е- го в системе по тока о тдельны й стек. Э то значит, что при со здании неско льких экземпляро в о бъ ектаTTestThread каж ды й имеетсо бственную ко пию перемен- но й i в сво ем со бственно м стеке. С ледо вательно , в этом о тно ш ении все по токи будутдейство ватьнезависимо друг о тдруга. О днако нео бх о димо заметить, что по нятие «о дно й и той ж е» переменно й (ко - торая в сво ем по токе действуетнезависимо о тко ллег) о тню дь не перено сится нагло бальны епеременны е.
Страницы
- « первая
- ‹ предыдущая
- …
- 4
- 5
- 6
- 7
- 8
- …
- следующая ›
- последняя »