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

UptoLike

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

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 в сво ем со бственно м стеке. С ледо вательно , в этом о тно ш ении все по токи
будутдейство ватьнезависимо друг о тдруга.
   О днако нео бх о димо заметить, что по нятие «о дно й и той ж е» переменно й (ко -
торая в сво ем по токе действуетнезависимо о тко ллег) о тню дь не перено сится
нагло бальны епеременны е.