Разработка многопоточных приложений. Рудалев В.Г - 11 стр.

UptoLike

11
и редактирование Edit1 другим потоком или пользователем , что в данном
простом примере не имеет особого значения , но в принципе недопустимо. Чтобы
лучше понять происходящее, измените метод, добавив задержку на 1 секунду:
procedure TSimpleThread.OutMessage;
begin
Sleep(1000);
Form1.Edit1.Text := IntToStr(count);
end;
После запуска программы обнаружится , что в течение одной секунды ме-
жду приращениями счетчика невозможно ни отредактировать строку, ни перемес-
тить окно : метод OutMessage выполняется в главном потоке и блокирует его ос-
тальные действия , как это было в лаб . работе 1 при нажатии кнопки «Без потока» .
(Временная задержка 1 сек. нужна лишь, чтобы визуально заметить данный эф -
фект). Очевидно, метод OutMessage не рекомендуется загромождать вычисления -
ми, так как это сильно замедлит работу главного потока.
2. Чтобы создать поток, удобно воспользоваться имеющимся в Delphi
шаблоном: выбрать пункт меню File | New | Thread Object и ввести имя класса по-
тока- потомка TThread, например, TFirstThread. После этого появится автоматиче-
ски сгенерированный модуль с объявлением класса TFirstThread, который следует
должным образом видоизменить и подключить к вызывающему модулю обычной
директивой uses. Упражнение: переделайте лабораторную работу с использова-
нием шаблонов.
Лабораторная работа 3 (самостоятельная)
Доработайте предыдущий проект, сделав два независимых аналогичных
потока Thread1, Thread2, выводящих результаты в отдельные строки редактиро -
вания . Здесь можно описать два класса, но поскольку два потока идентичны ,
можно ограничиться созданием двух экземпляров одного класса TSimpleThread.
Для ступенчатой регулировки приоритетов используйте два компонента TTrack-
Bar (см . рисунок). Проект должен показывать изменение скорости работы в за-
висимости от установленного приоритета. Образцы решения задачи см . в [4,5].
      иредактирование Edit1 друг им п отоком или п ользователем, что в данном
п ростом п римеренеимеет особ ог о значения, но в п ринцип ен едопу ст и м о. Ч тоб ы
лучш еп онять п роисходящ ее, изменитеметод, доб авив задерж ку на1 секунду:

       procedure TSimpleThread.OutMessage;
       begin
         Sleep(1000);
         Form1.Edit1.Text := IntToStr(count);
       end;

         П осле зап ускап рог раммы об наруж ится, что в течение одной секунды ме-
ж ду п риращ ениямисчетчиканевозмож но ниотредактировать строку, нип еремес-
тить окно: метод OutMessage вы п олняется в г лавном п отоке иб локирует ег о ос-
тальны едействия, как это б ы ло в лаб . раб оте1 п ринаж атиикноп ки« Безп отока».
(В ременная задерж ка1 сек. нуж налиш ь, чтоб ы визуально заметить данны й эф -
ф ект). О чевидно, метод OutMessage нерекомендуетс       я загромож дать вы числения-
ми, так как это сильно замедлитраб оту г лавног о п отока.
         2. Ч тоб ы создать п оток, удоб но вос п ользоваться имею щ имся в Delphi
ш аб лоном: вы б рать п унктменю File | New | Thread Object иввестиимя классап о-
тока-п отомкаTThread, нап ример, TFirstThread. П ослеэтог о п оявится автоматиче-
скисгенерированны й модуль соб ъ явлением классаTFirstThread, которы й следует
долж ны м об разом видоизменить ип одклю чить к вы зы ваю щ ему модулю об ы чной
директивой uses. У пр а ж н ен и е: п еределайте лаб ораторную раб оту сис  п ользова-
нием ш аб лонов.


       Лаб о рато рн ая раб о та № 3 (сам о сто ятельн ая)

       Д ораб отайте п реды дущ ий п роект, сделав дванезависимы х аналог ичны х
п отокаThread1, Thread2, вы водящ их результаты в отдельны е строкиредактиро-
вания. Здесь мож но оп исать двакласса, но п оскольку двап отокаидентичны ,
мож но ог раничиться созданием двух экземп ляров одног о класс   аTSimpleThread.
Д ля ступ енчатой рег улировкип риоритетов ис   п ользуйте двакомп онентаTTrack-
Bar (см. рисунок). П роект долж ен п оказы вать изменение скоростираб оты в за-
висимостиотустановленног о п риоритета. О б разцы реш ения задачи с   м. в [4,5].




                                                                                   11