close

Вход

Забыли?

вход по аккаунту

?

ОС ЛР2

код для вставкиСкачать
Федеральное агентство по образованию Рязанский Государственный Радиотехнический Университет
Отчёт по лабораторной работе № 2
Средства синхронизации потоков и их реализация в среде Delphi.
Выполнили:
ст. гр. 842 Бакин С.С.
Золотов И.В.
Проверил:
Засорин С.В.
Рязань 2011
Задание 1. Критические секции.
Исходный код программы:
unit1.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls, SyncObjs;
type
TMoveThread = class(TThread)
private
FBox: TPaintBox;
b0, b1: tbitmap;
i: integer;
j: real;
procedure DoVisualSwap;
procedure DoVisual;
protected
procedure Execute; override;
public
constructor Create(a, b: TBitmap; c: TPaintBox);
destructor Destroy;
end;
TForm1 = class(TForm)
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Button3: TButton;
PaintBox1: TPaintBox;
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
private
{ Private declarations }
public
Thread1, Thread2: TMoveThread;
c: TCriticalSection;
end;
var
Form1: TForm1;
taxi00, rtaxi00, taxi01, rtaxi01: TBitMap;
implementation
{$R *.dfm}
procedure TMoveThread.DoVisualSwap;
begin
FBox.Canvas.Draw(i, 0, b0);
j := j + 0.01;
i := trunc(j);
end;
procedure TMoveThread.DoVisual;
begin
FBox.Canvas.Draw(i, 0, b1);
j := j - 0.01;
i := trunc(j);
end;
procedure TMoveThread.Execute;
begin
while true do
begin
Form1.c.Enter;
try
while i <= (fbox.Width + b0.Width) do Synchronize(DoVisualSwap);
finally
Form1.c.Leave;
end;
Form1.c.Enter;
try
while i >= (0 - b0.Width) do Synchronize(DoVisual);
finally
Form1.c.Leave;
end;
end;
end;
constructor TMoveThread.Create(a, b: tbitmap; c: TPaintBox);
begin
b0 := a; b1 := b; Fbox := c; i := 0;
inherited Create(False);
end;
destructor TMoveThread.Destroy;
begin
b0.free;
b1.free;
inherited Destroy;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := false;
Button2.Enabled := true;
if Thread1.Suspended then Thread1.Resume;
if Thread2.Suspended then Thread2.Resume;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Button1.Enabled := true;
Button2.Enabled := false;
if not Thread1.Suspended then Thread1.Suspend;
if not Thread2.Suspended then Thread2.Suspend;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
c := TCriticalSection.Create;
taxi00 := tbitmap.Create;
taxi00.LoadFromFile('taxi00.bmp');
rtaxi00 := tbitmap.Create;
rtaxi00.LoadFromFile('rtaxi00.bmp');
taxi01 := tbitmap.Create;
taxi01.LoadFromFile('taxi01.bmp');
rtaxi01 := tbitmap.Create;
rtaxi01.LoadFromFile('rtaxi01.bmp');
Thread1 := TMoveThread.Create(taxi00, taxi01, PaintBox1);
Thread1.Priority := tplowest;
Thread2 := TMoveThread.Create(rtaxi00, rtaxi01, PaintBox1);
Thread2.Priority := tplowest;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
var
i: Integer;
Priority: TThreadPriority;
begin
Priority := tpLowest;
for i := 0 to (Sender as ttrackBar).Position - 1 do
inc(Priority);
if Sender = TrackBar1
then Thread1.Priority := Priority else Thread2.Priority := Priority;
end;
end.
Результаты выполнения программы представлены на рисунках 1.1 и 1.2.
Рисунок 1.1. Первая машина едет направо.
Рисунок 2.2. Вторая машина едет налево.
Задание 2. Объект Mutex.
Исходный код программы:
unit1.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls, IPCThrd;
type
TMoveThread = class(TThread)
private
FBox: TPaintBox;
b0, b1: tbitmap;
i: integer;
j: real;
procedure DoVisualSwap;
procedure DoVisual;
protected
procedure Execute; override;
public
constructor Create(a, b: TBitmap; c: TPaintBox);
destructor Destroy;
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
PaintBox1: TPaintBox;
Edit1: TEdit;
Label1: TLabel;
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Edit1Change(Sender: TObject);
private
{ Private declarations }
public
Thread1, Thread2: TMoveThread;
time: word;
m: TMutex;
end;
var
Form1: TForm1;
taxi00, rtaxi00, taxi01, rtaxi01: TBitMap;
implementation
{$R *.dfm}
procedure TMoveThread.DoVisualSwap;
begin
FBox.Canvas.Draw(i, 0, b0);
j := j + 0.01;
i := trunc(j);
end;
procedure TMoveThread.DoVisual;
begin
FBox.Canvas.Draw(i, 0, b1);
j := j - 0.01;
i := trunc(j);
end;
procedure TMoveThread.Execute;
begin
while true do begin
Form1.m.get(Form1.time);
try
while i <= (fbox.Width + b0.Width) do Synchronize(DoVisualSwap);
finally Form1.m.Release;
end;
Suspend;
Form1.m.Get(Form1.time);
try
while i >= (0 - b0.Width) do Synchronize(DoVisual);
finally Form1.m.Release;
end;
Suspend;
end;
end;
constructor TMoveThread.Create(a, b: tbitmap; c: TPaintBox);
begin
b0 := a; b1 := b; Fbox := c; i := 0;
inherited Create(False);
end;
destructor TMoveThread.Destroy;
begin
b0.free;
b1.free;
inherited Destroy;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := false;
Button2.Enabled := true;
if Thread1.Suspended then Thread1.Resume;
if Thread2.Suspended then Thread2.Resume;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Button1.Enabled := true;
Button2.Enabled := false;
if not Thread1.Suspended then Thread1.Suspend;
if not Thread2.Suspended then Thread2.Suspend;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
m := TMutex.Create('mutex');
time := 1000;
taxi00 := tbitmap.Create;
taxi00.LoadFromFile('taxi00.bmp');
rtaxi00 := tbitmap.Create;
rtaxi00.LoadFromFile('rtaxi00.bmp');
taxi01 := tbitmap.Create;
taxi01.LoadFromFile('taxi01.bmp');
rtaxi01 := tbitmap.Create;
rtaxi01.LoadFromFile('rtaxi01.bmp');
Thread1 := TMoveThread.Create(taxi00, taxi01, PaintBox1);
Thread1.Priority := tplowest;
Thread2 := TMoveThread.Create(rtaxi00, rtaxi01, PaintBox1);
Thread2.Priority := tplowest;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
try
time := StrToInt(Edit1.Text);
Edit1.Text := IntToStr(time);
except
Edit1.Text := '1000';
time := 1000;
end;
end;
end.
Результаты выполнения программы представлены на рисунке 2.1.
Рисунок 2.1. Вторая машина ещё не появилась.
Рисунок 2.2. Вторая машина появилась.
Задание 3. Событие.
Исходный код программы:
Задание 4. Семафор.
Исходный код программы:
2
Документ
Категория
Рефераты
Просмотров
17
Размер файла
88 Кб
Теги
лр2
1/--страниц
Пожаловаться на содержимое документа