ВУЗ:
Составители:
Рубрика:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 11
- 12
- 13
- 14
- 15
- …
- следующая ›
- последняя »