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

UptoLike

13
Лабораторная работа 4.
Синхронизация доступа к глобальной пе-
ременной с помощью критической секции
Рассмотрим пример, когда два потока обращаются к одной и той же гло-
бальной переменной GlobalData, увеличивают и сразу уменьшают ее значение
GlobalData := GlobalData+3;
GlobalData := GlobalData-3;
а результаты выводят в соответствующие компоненты TMemo. Для созда-
ние программы выполните следующее.
1. Разместите на форме два компонента Memo1 и Memo2, две метки с над -
писями «Первый поток:» и «Второй поток:», кнопку Button1 «Выполнить», вы -
ключатель cbSect: TCheckBox с подписью «Использовать критическую секцию».
Чтобы можно было сравнивать результаты , полученные с использованием син -
хронизации и без синхронизации, в обработчике события OnClick для выключате-
ля запишите
CritSect := cbSect.Checked;
2. Инициализацию и удаление критической секции запишите, соответст -
венно , в обработчиках событий OnCreate и OnDestroy для формы .
3. Так оба потока идентичны , нерационально создавать два отдельных
класса. Поэтому опишите один класс TMyThread, переопределите его методы и
создайте два экземпляра этого класса, как показано на листинге.
unit ThrdUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, ComCtrls, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
cbSect: TCheckBox;
Label1: TLabel;
Label2: TLabel;
Memo1: TMemo;
Memo2: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure cbSectClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
      Лаб о рато рн ая раб о та № 4. Синхронизация доступ ак г лоб альной п е-
ременной сп омощ ью критической секции

       Рассмотрим п ример, ког дадвап отокаоб ращ аю тся к одной итой ж е г ло-
б альной п еременной GlobalData, увеличиваю тисразу уменьш аю теезначение

       GlobalData := GlobalData+3;
       GlobalData := GlobalData-3;

        арезультаты вы водят в соответствую щ ие комп оненты TMemo. Д ля созда-
ниеп рог раммы вы п олнитес  ледую щ ее.
        1. Разместитенаф ормедвакомп онентаMemo1 иMemo2, двеметкиснад-
п исями « П ервы й п оток:» и « В торой п оток:», кноп ку Button1 « В ы п олнить», вы -
клю чатель cbSect: TCheckBox сп одп исью « И сп ользовать критическую секцию ».
Ч тоб ы мож но б ы ло сравнивать результаты , п олученны е сисп ользованием син-
хронизациииб езсинхронизации, в об раб отчикесоб ы тия OnClick для вы клю чате-
ля зап иш ите

        CritSect := cbSect.Checked;

       2. И нициализацию и удаление критичес    кой секции зап иш ите, с
                                                                       оответст-
венно, в об раб отчиках соб ы тий OnCreate иOnDestroy для ф ормы .
       3. Т ак об ап отокаидентичны , нерационально создавать дваотдельны х
класса. П оэтому оп иш итеодин классTMyThread, п ереоп ределитеег о методы и
создайтедваэкземп ляраэтог о класса, как п оказано налистинг е.

       unit ThrdUnit;
       interface
       uses
             Windows, Messages, SysUtils, Classes, Graphics, Controls,
       Forms, Dialogs, ComCtrls, StdCtrls, ExtCtrls;

       type
         TForm1 = class(TForm)
            Button1: TButton;
            cbSect: TCheckBox;
            Label1: TLabel;
            Label2: TLabel;
            Memo1: TMemo;
            Memo2: TMemo;
            procedure Button1Click(Sender: TObject);
            procedure FormCreate(Sender: TObject);
            procedure FormDestroy(Sender: TObject);
            procedure cbSectClick(Sender: TObject);
         private
            { Private declarations }
         public
            { Public declarations }
         end;
                                                                                    13