Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабник по СПО

.pdf
Скачиваний:
9
Добавлен:
05.06.2015
Размер:
1.59 Mб
Скачать

Восстановление фона произведём с помощью метода CopyRect, выполняющего копирование прямоугольного фрагмента одного битового образа в другой. Объект, к которому применен метод CopyRect, является приёмником копии битового образа. В качестве параметров методу передаются: координаты и размер области, в которую должно быть выполнено копирование; поверхность, с которой должно быть выполнено копирование; положение и размер копируемой области. Информацию о положении и размерах восстанавливаемой области фона сохраним в структуре badRect типа TRect.

Текст программы на языке Delphi

Объявляем переменные:

Var

fmPlane: TfmPlane; Back: TBitMap; Plan: TBitMap; x,y,dx,Pol :Integer; BadRect :TRect;

Переменные x и y - координаты левого верхнего угла прямоугольника, в котором рисуется самолёт, dx - приращение координат по оси x, Pol - переменная, хранящая состояние движения: стоянка или полёт. BadRect - область, которую нужно восстанавливать после стирания изображения самолёта. Plan и Back - графические объекты, в которых формируется и хранится изменяемая часть рисунка.

Переменной х, определяющей положение левой верхней точки движущейся картинки, присваиваем отрицательное значение, равное ширине битового образа картинки. Это необходимо для вылета самолёта из-за левой границы окна.

Создание графических объектов, т.е. выделение под них памяти, загрузку из файла рисунка самолёта, задание начальных координат, значение приращения dx и задание режима движения производим в обработчике события формы OnCreate.

Procedure TfmPlane.FormCreate(Sender: TObject);

Begin dx:=1; Pol:=1;

Back:=TBitMap.Create;

Plan:=TBitMap.Create;

Plan.LoadFromFile('plane.bmp');

191

PDF created with pdfFactory Pro trial version www.pdffactory.com

Plan.Transparent:=True; x:=-40;

y:=10;

BadRect:=Rect(x,y,x+Plan.Width,x+Plan.Height);

Image1.Canvas.CopyRect (BadRect, Back.Canvas,BadRect); Timer1.Interval:=1; Timer1.Enabled:=True

End;

В обработчик события OnTimer записываем операторы, реализующие блоки 8, 10, 11, 13, 14 и 17 - 22 схемы рис.8.1. Блок 20 реализуется оператором Sleep и интервалом таймера.

Procedure TfmPlane.Timer1Timer(Sender: TObject);

Begin

BadRect:=Rect(x,y,x+Plan.Width,x+Plan.Height); Image1.Canvas.CopyRect(BadRect, Back.Canvas,BadRect); x:=x+dx;

If Pol=1 Then

Begin

If (y<(ClientHeight-55))And(dx>0) Then x:=x+1;

y:=y-1;

If y<20 Then y:=19

End;

If x > ClientWidth

Then Begin

Pol:=0; x:=-20;

y:=Random(ClientHeight-55)

End;

If dx=0 Then

If y<(ClientHeight-55) Then If Pol=0 Then Begin

x:=x+1;

y:=y+1;

192

PDF created with pdfFactory Pro trial version www.pdffactory.com

End

Else y:=ClientHeight-55; Canvas.Draw(x,y,plan); Sleep(10)

End;

На каждом такте таймера координата х увеличивается на величину dx. При вылете

самолёта за правую границу восстанавливается начальное значение переменной х и присваивается новое значение высоте полёта.

Всобытие OnChange объекта ScrollBar1 вводим операторы задания скорости полёта.

Procedure TfmPlane.ScrollBar1Change(Sender: TObject);

Begin dx:=ScrollBar1.Position;

If dx<>0 Then Begin

StrStop.Caption:='Стоп'; Pol:=1

End Else Begin

StrStop.Caption:='Старт'; Pol:=0

End

End;

Всобытие OnClick кнопки Старт/Стоп вводим операторы начала и прекращения движения.

Procedure TfmPlane.StrStopClick(Sender: TObject);

Begin

If dx=0 Then Begin

StrStop.Caption:='Стоп'; dx:=ScrollBar1.Position; Pol:=1

End Else Begin

StrStop.Caption:='Старт'; dx:=0;

Pol:=0

End

193

PDF created with pdfFactory Pro trial version www.pdffactory.com

End;

Для того чтобы освободить память, выделенную под графические объекты, введём операторы, освобождающие память, в обработчик события OnClose главной формы.

Procedure TfmPlane.FormClose

(Sender: TObject; Var Action: TCloseAction); Begin Back.Free; Plan.Free End;

Текст программы на языке С++

Объявляем переменные в классе формы на заголовочном файле: public: // User declarations

__fastcall TfmPlane(TComponent* Owner); Graphics::TBitmap *back; Graphics::TBitmap *plan;

int x,y,dx,Pol; TRect badRect;

Переменные x и y - координаты левого верхнего угла прямоугольника, в котором рисуется самолёт, dx - приращение координат по оси x, Pol - переменная, хранящая состояние движения: остановка или полёт, badRect - область, которую нужно восстанавливать после стирания изображения самолёта, plan и back - графические объекты, в которых формируется и хранится изменяемая часть рисунка.

Начальное значение переменной х, определяющей положение левой верхней точки движущейся картинки, делаем отрицательным числом, равным ширине битового образа картинки. Это сделано для вылета изображения самолёта из-за левой границы окна.

Создание графических объектов, загрузку из файла рисунка самолёта и задание начальных координат производим в файле формы.

__fastcall TfmPlane::TfmPlane(TComponent* Owner) : TForm(Owner)

{back = new Graphics::TBitmap(); plan = new Graphics::TBitmap(); plan->LoadFromFile("plane.bmp"); plan->Transparent=true;

x=-40; y=10;

badRect=Rect(x,y,x+plan->Width,x+plan->Height); Image1->Canvas->CopyRect

(badRect, back->Canvas,badRect);

194

PDF created with pdfFactory Pro trial version www.pdffactory.com

Timer1->Interval=1; Timer1->Enabled=true;

}

Вобработчике события OnCreate формы задаём начальное значение приращения dx и начальный режим горизонтального движения.

void __fastcall TfmPlane::FormCreate(TObject *Sender)

{dx=1; Pol=1; }

Вобработчик события OnTimer записываем операторы, реализующие блоки 8, 10, 11, 13, 14 и 17 - 22 схемы рис.8.1. Блок 20 реализуется оператором Sleep и интервалом таймера. void __fastcall TfmPlane::Timer1Timer(TObject *Sender)

badRect=Rect(x,y,x+plan->Width,x+plan->Height); Image1->Canvas->CopyRect

(badRect, back->Canvas,badRect); x=x+dx;

if (Pol==1)

{if ((y<(ClientHeight-55))&(dx>0)) x=x+1; y=y-1;

if (y<20) y=19;

}

if (x > ClientWidth)

{

Pol=0; x=-20;

y=random(ClientHeight-55);

}

if (dx==0)

{

if (y<(ClientHeight-55))

{

if (Pol==0){ x=x+1; y=y+1;

}

else y=ClientHeight-55;

195

PDF created with pdfFactory Pro trial version www.pdffactory.com

}

}

Canvas->Draw(x,y,plan); Sleep(10);

}

На каждом такте таймера координата х увеличивается на величину dx. Когда самолёт улетает за правую границу, восстанавливается начальное значение переменной х и присваивается новое, случайное, значение высоте полёта.

В событие OnChange объекта ScrollBar1 вводим операторы задания скорости. void __fastcall TfmPlane::ScrollBar1Change

(TObject *Sender)

{

dx=ScrollBar1->Position; if (dx!=0)

{

StStop->Caption="Стоп"; Pol=1;

}

else

{ StStop->Caption="Старт"; Pol=0; }

}

В событие OnClick кнопки Старт/Стоп вводим операторы начала и прекращения движения.

void __fastcall TfmPlane::StStopClick(TObject *Sender)

{

if (dx==0)

{

StStop->Caption="Стоп"; dx=ScrollBar1->Position; Pol=1;

}

else

{

StStop->Caption="Старт"; dx=0;

196

PDF created with pdfFactory Pro trial version www.pdffactory.com

Pol=0;

}

}

Для того чтобы освободить память, выделенную под графические объекты, введём операторы, освобождающие память, в обработчик события OnClose главной формы.

void __fastcall TfmPlane::FormClose (TObject *Sender, TCloseAction &Action) {back->Free();

plan->Free();

}

Контрольные вопросы

9.Как можно создать эффект движения на экране?

10.Как совместить два рисунка?

11.Как сделать, чтобы нижний рисунок был виден под верхним рисунком?

12.От чего зависит скорость движения объекта?

13.При каких условиях движение на экране будет плавным?

14.Как выделить память под графический объект?

15.Для чего используется метод двойной буферизации?

16.Как освободить память, выделенную под графический объект?

197

PDF created with pdfFactory Pro trial version www.pdffactory.com

Лабораторная работа № 9. Создание многопоточных приложений

Задание

Цель работы:

1.Изучение методов организации параллельных потоков внутри процесса.

2.Исследование способов задания приоритетов потокам и влияние приоритетов, присвоенных потокам, на выделяемое потокам время.

3.Освоение приёмов создания и удаления потоков в многопоточных приложениях.

Содержание работы:

Разработка многопоточного приложения для одновременного рисования фигур на трёх холстах.

Технические требования к приложению:

Число потоков: 3.

Выполняемые действия: непрерывное рисование на трёх полотнах одновременно. Отображаемая информация:

Ÿнарисованные элементы;

Ÿчисло нарисованных элементов на каждом полотне;

Ÿприоритеты потоков.

Задаваемые параметры: приоритеты потоков. Вводимые команды: запуск потоков, останов потоков. Число форм в проекте: 1.

Форма отчёта:

Текст проекта в папке с именем Work9 на диске Н:.

Содержание отчёта:

Файлы проекта и исполняемый файл.

198

PDF created with pdfFactory Pro trial version www.pdffactory.com

Понятие потока

В операционной системе каждому процессу выделяется необходимое адресное пространство и обычно создаётся один управляющий поток команд. Фактически это и определяет процесс. Но иногда возникает необходимость одновременного выполнения нескольких задач в одной прикладной программе, и тогда могут быть созданы несколько параллельных потоков в одном адресном пространстве.

Понятие процесса основано на двух независимых концепциях: группирование ресурсов и выполнение программы. У процесса есть адресное пространство, содержащее текст программы, данные и другие выделенные процессу ресурсы. К ресурсам, кроме памяти, можно отнести: открытые файлы, дочерние процессы, порты ввода-вывода, необработанные сообщения, обработчики сигналов и многое другое. Ресурсами проще управлять, объединив их в форме процесса.

Одновременно процесс можно рассматривать как поток исполняемых команд. У потока имеются: счётчик команд, регистры и стек. Хотя поток исполняется внутри процесса, разделение понятий процесса и потока упрощает анализ работы операционной системы.

Концепция потоков добавляет к модели процесса возможность одновременно выполнять в среде одного процесса несколько задач. Несколько потоков, работающих параллельно в одном процессе, во многом аналогичны процессам, работающим параллельно на одном компьютере. Но потоки одного процесса разделяют общее адресное пространство и другие ресурсы, кроме времени центрального процессора, а процессы имеют отдельные адресные пространства и параллельное использование других ресурсов. Потоки обладают некоторыми свойствами процессов, поэтому их иногда называют облегченными процессами.

Потоки, как и процессы, могут обладать разными приоритетами. Во время создания потока его приоритет устанавливается равным приоритету процесса, если нет особых указаний. По умолчанию потоки имеют одинаковые приоритеты, и всем потокам выделяются одинаковые кванты времени. Если потокам установить разные приоритеты, то потоку с большим приоритетом будут выделяться большие кванты времени.

Приоритеты потока могут принимать значения, отличающиеся на ±2 пункта от базового приоритета процесса.

Для того чтобы присвоить потокам разные приоритеты, необходимо свойству потока Priority задать соответствующее значение. Свойство Priority имеет тип TThreadPriority и может принимать следующие значения:

199

PDF created with pdfFactory Pro trial version www.pdffactory.com

ŸtpIdle - поток выполняется, только если операционной системе больше некого запускать, имеет значение 1 или 16 для процессов реального времени;

ŸtpLowest - приоритет на два пункта ниже нормального;

ŸtpLower - приоритет на один пункт ниже нормального;

ŸtpNormal - приоритет нормальный;

ŸtpHigher - приоритет на один пункт выше нормального;

ŸtpHighest - приоритет на два пункта выше нормального;

ŸtpTimeCritical - максимальный приоритет, имеет значение 15 или 31 для процессов реального времени.

Схема приложения

Для рисования на трёх объектах создаём три синхронизированных потока,

запускаем их в параллельном режиме работы и формируем средства для изменения приоритетов потоков (рис.9.1).

Создание потока должно начинаться с создания объекта потока типа TNewThread, затем необходимо создать и запустить потоки. Поток действует, пока его свойство Terminated равно False. Каждый поток запускается и останавливается индивидуально, но работа потоков должна быть синхронизирована. Синхронизацию потоков обеспечивают средства, которые выбирают момент переключения центрального процессора между потоками таким образом, чтобы графические операторы потока были завершены. Если чередовать функции вывода на экран графических объектов слишком часто и в моменты, когда эти процессы не завершены, то могут возникнуть непредсказуемые системные ошибки. Для синхронизации работы потоков в классе TThread предусмотрен метод

Synchronize.

В данном приложении схемы действий в трёх потоках аналогичны (рис.9.2) и отличаются только номерами потоков и переменных. В каждом потоке предусмотрена команда на останов потока, но после останова одного потока повторно запускать нужно только один поток, или перед повторным запуском потоков останавливать действующие потоки. Для останова потока используется процедура Terminate, присваивающая свойству

Terminated значение True.

200

PDF created with pdfFactory Pro trial version www.pdffactory.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]