- •Государственное образовательное учреждение высшего профессионального образования
- •1 Формулировка задания
- •2.1 Описание алгоритма
- •2.2 Абстрактная модель программы.
- •2.2.1 Создание потоков
- •2.2.2 Приостановка и возобновление выполнения потоков
- •2.2.4 Смена приоритетов
- •Заключение
- •Список используемой литературы
- •Приложение а
Список используемой литературы
1.Лекции по предмету «Параллельные и распределенные вычисления»
2. «Программирование в Delphi» А.Я.Архангельский,2008 г.
Приложение а
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls;
type
TMoveThread = class(TThread)
private
FBox: TPaintBox; // Где воспроизводится картинка
b0,b1: tbitmap; // Сами картинки
i:integer; // Для определения координат картинки
procedure DoVisualSwap; // Одна процедура двигает вправо,
procedure DoVisual; // Другая влево
protected
procedure Execute; override;
public
constructor Create(a,b: TBitmap; c:TPaintBox);
destructor Destroy; override;
end;
type
TForm1 = class(TForm)
PaintBox1: TPaintBox;
PaintBox2: TPaintBox;
PaintBox3: TPaintBox;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
TrackBar3: TTrackBar;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
TrackBar4: TTrackBar;
Button8: TButton;
Button9: TButton;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure TrackBar4Change(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Thread1,
Thread2,
Thread3:TMoveThread;
end;
var
Form1: TForm1;
var taxi00:TBitmap;
taxi01:TBitmap;
implementation
{$R *.dfm}
var speed:integer=0;
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 TMoveThread.DoVisualSwap; { Двигает картинку вправо }
begin
with FBox do
begin
canvas.Draw(i,0,b0);
i:=i+1;
sleep(speed);
end;
Application.ProcessMessages;
end;
procedure TMoveThread.DoVisual; { Двигает картинку влево }
begin
with FBox do
begin
canvas.Draw(i,0,b1);
i:=i-1;
sleep(speed);
end;
Application.ProcessMessages;
end;
procedure TMoveThread.Execute; {В зависимости от координат, картинка двигается
влево или вправо }
begin
while true do
begin
while i<=(fbox.Width+b0.Width) do
begin
Synchronize(DoVisualSwap);
end;
while i>=(0-b0.Width) do
begin
Synchronize(DoVisual);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Thread1.Suspended=true then Thread1.Resume;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if Thread1.Suspended=false then Thread1.Suspend;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if Thread2.Suspended=true then Thread2.Resume;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if Thread2.Suspended=false then Thread2.Suspend;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
if Thread3.Suspended=true then Thread3.Resume;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
if Thread3.Suspended=false then Thread3.Suspend;
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
Thread1.Suspend;
Thread2.Suspend;
Thread3.Suspend;
end;
procedure TForm1.Button8Click(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.Button9Click(Sender: TObject);
begin
if not Thread1.Suspended then
Thread1.Suspend;
if not Thread2.Suspended then
Thread2.Suspend;
if not Thread3.Suspended then
Thread3.Suspend;
Thread1.i:=0;
Thread2.i:=0;
Thread3.i:=0;
PaintBox1.Refresh;
PaintBox2.Refresh;
PaintBox3.Refresh;
Thread1.Resume;
Thread2.Resume;
Thread3.Resume;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{}
taxi00:=tbitmap.Create; // Создается объект BitMap
taxi00.LoadFromFile('taxi00.bmp'); //В него загружается изображение
taxi01:=tbitmap.Create;
taxi01.LoadFromFile('taxi01.bmp');
thread1:= TMoveThread.Create(taxi00,taxi01,PaintBox1); //Создается поток
Thread1.Priority:=tpLowest; // Устанавливается небольшой приоритет у потока; это необходимо для того, чтобы поток был управляемым и не забирал все ресурсы.
thread2:= TMoveThread.Create(taxi00,taxi01,PaintBox2); //Создается поток
Thread2.Priority:=tpLowest;
thread3:= TMoveThread.Create(taxi00,taxi01,PaintBox3); //Создается поток
Thread3.Priority:=tpLowest;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
taxi00.Free;
Taxi01.Free;
Thread1.Terminate;
Thread2.Terminate;
Thread3.Terminate;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
var I: integer;
priority:TThreadPriority;
{ Изменение приоритета соответствующего потока }
begin
priority:=tpIdle;
for i:=0 to ((sender as ttrackbar).position -1) do inc(priority);
if sender=trackbar1 then thread1.priority:=priority
else
if sender=trackbar3 then thread3.priority:=priority
else thread2.Priority:=priority;
end;
procedure TForm1.TrackBar4Change(Sender: TObject);
begin
speed:=round(TrackBar4.Position/10);
end;
end.