Лабник по СПО
.pdf
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
13 |
|
|
|
|
|
|
|
|
|
|
|
|
|
Начало |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
Поток 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
Terminate |
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
? |
|
|
|
|
|
|
|
|
Да |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Нет |
|
|
|
Выход |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
|
Конец |
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
3 |
|
|
|
? |
|
|
|
Нет |
|
|
|
|
? |
|
|
|
|
|
|
|
Нет |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||
Действует |
|
|
|
|
Приоритет |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||
|
|
|
Да |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
? |
|
|
|
|
|
|
|
|
Нет |
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Да |
|
|
|
|
|
5 |
|
||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Пуск |
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Задание |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Да |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Создание потоков |
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Запуск потоков |
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
|
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
Поток 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Поток 3 |
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Поток 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
While Not |
|
|
|
|
|
|
|
|
|
|
|
While Not |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
While Not |
||||||||||||||||||||||||||
|
|
|
|
|
Terminated |
|
|
|
|
|
|
|
|
|
Terminated |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Terminated |
|||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
Действия 1 |
|
|
|
|
|
|
|
|
|
|
|
|
Действия 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Действия 3 |
|
||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Да |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
Да |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
11 |
|
|
? |
|
|
|
|
Да |
|
|
|
|
|
|
|
|
|
|
|
|
21 |
? |
|
|
|
||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
16 |
|
|
? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
Стоп |
|
|
|
|
|
|
|
|
|
|
|
|
|
Стоп |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Стоп |
|||||||||||||||||
|
12 |
|
|
|
|
Нет |
|
|
|
|
|
|
|
17 |
|
|
|
|
|
Нет |
|
|
|
|
|
|
|
|
|
|
|
|
22 |
|
|
|
|
Нет |
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
Поток 1 |
|
|
|
|
|
|
|
|
|
|
|
Поток 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Поток 3 |
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Поток 2 |
|
|
|
|
|
|
|
|
|
|
Поток 3 |
|
|
|
|
|
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Terminate |
|
|
|
|
|
|
|
Terminate |
|
|
|
|
|
|
Рис.9.1. Схема программы, создающей три параллельных потока
1 Начало
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
|
|
4 |
|
|
|
|
Выбор |
|
|
|
|
|
||||
Вывод |
|
|
|
|||||||
|
|
|
|
|
N1:=N1+1 |
|||||
|
параметров |
фигуры |
|
|
||||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
|
Конец |
|
|
|
|
|
|
|
|
|
|
Рис.9.2. Схема процедуры рисования фигуры
201
PDF created with pdfFactory Pro trial version www.pdffactory.com
После создания и запуска потоков каждый поток самостоятельно производит выбор параметров, рисование фигур и подсчёт числа нарисованных фигур.
Создание и запуск потоков должны происходить после команды Пуск. По умолчанию все потоки получают одинаковые приоритеты, равные приоритету процесса, их создающего. Для задания разных приоритетов потокам в схеме приложения предусмотрен блок 6. Приоритет потока должен задаваться после его создания.
Создание проекта
Создаём проект типа VCL Forms Application. Сохраняем проект в подготовленной заранее папке с именем Work9, присваиваем главному модулю имя MainUnit, а проекту - имя Thread3. Присваиваем главной форме имя MainForm.
Помещаем на форму три холста типа ТPaintBox, три метки для вывода числа нарисованных фигур, три списка типа ТComboBox для выбора приоритетов. В свойство Items каждого списка вводим семь приоритетов:
tpIdle tpLowest tpLower tpNormal tpHigher tpHighest tpTimeCritical
Холстам для рисования PaintBox1, PaintBox2 и PaintBox3 задаём размеры
150×150 пикселей.
Устанавливаем две кнопки: Пуск и Стоп для управления потоками, и кнопку Выход для закрытия программы. Вид окна программы показан на рис.9.3.
Рис.9.3. Окно программы с тремя потоками, рисующими фигуры
202
PDF created with pdfFactory Pro trial version www.pdffactory.com
Текст программы на языке Delphi
Написание текста проекта начинаем с создания процедуры рисования геометрических фигур и проверки их работы. Для каждого потока создадим отдельную процедуру рисования фигур.
Procedure TMainForm.CPaint1(Cv: TCanvas);
Var
J,I: Byte;
C: TColor;
Begin
Cv.Brush.Style:=bsSolid;
C:=Random(16777216);
J:=Random(30);
I:=Random(30);
Cv.Pen.Color:=C;
Cv.Brush.Color:=C;
Cv.Rectangle(J*5,I*5,J*5+5,I*5+5);
N1:=N1+1;
Label1.Caption:=IntToStr(N1)
End;
Procedure TMainForm.CPaint2(Cv: TCanvas);
Var
J,I: Byte; C: TColor;
Begin
Cv.Brush.Style:=bsSolid;
C:=Random(16777216);
J:=Random(30);
I:=Random(30);
Cv.Pen.Color:=C;
Cv.Brush.Color:=C;
Cv.Rectangle(J*5,I*5,J*5+10,I*5+10);
N2:=N2+1;
Label2.Caption:=IntToStr(N2)
End;
Procedure TMainForm.CPaint3(Cv: TCanvas);
203
PDF created with pdfFactory Pro trial version www.pdffactory.com
Var
J,I: Byte;
C: TColor;
Begin
Cv.Brush.Style:=bsSolid;
C:=Random(16777216);
J:=Random(14);
I:=Random(14);
Cv.Pen.Color:=C;
Cv.Brush.Color:=C;
Cv.Rectangle(J*10,I*10,J*10+19,I*10+20);
N3:=N3+1;
Label3.Caption:=IntToStr(N3);
End;
Для проверки и отладки работы процедур временно установим на форму таймер и с его помощью вызовем процедуры CPaint1, CPaint2 и CPaint3. Запустим проект и проверим работу процедур рисования фигур и вывода числа нарисованных элементов.
Procedure TfmThread.Timer1Timer(Sender: TObject);
Begin
CPaint1(PaintBox1.Canvas);
CPaint2(PaintBox2.Canvas);
CPaint3(PaintBox3.Canvas);
End;
Если не сделать опережающее включение генератора случайных чисел, то первое случайное число всегда будет равно нулю, т.е. цвет первого элемента будет чёрным. Генератор случайных чисел запускаем командой Randomize в процедуре OnCreate. Убеждаемся, что если при создании формы не включить процедуру Randomize, то первый квадратик всегда будет чёрным. После проверки работы процедур CPaint1, CPaint2 и CPaint3 таймер удаляем.
Затем создаём объект потока типа TNewThread. Добавление в проект объекта потока производим командой File → New ... , вызывающей диалоговое окно New Items. В диалоговом окне New Items выбираем компонент Thread Object. В диалоговом окне ввода New Thread Object вводим название класса, например, TNewThread. Возникнет файл с пустым описанием класса TNewThread. Файл переименовываем командой Save As...,
например, в файл ThreadUnit.pas.
204
PDF created with pdfFactory Pro trial version www.pdffactory.com
Враздел Uses модуля MainUnit добавляем ссылку на модуль ThreadUnit.
Uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ThreadUnit, Buttons;
Враздел Implementation модуля ThreadUnit добавляем ссылку на модуль MainUnit.
Uses MainUnit;
Всписок переменных главной формы вводим переменные для описания потоков и хранения числа фигур.
Var
MainForm: TMainForm; T1,T2,T3: TNewThread; N1,N2,N3 :DWord;
Создаём основные процедуры, определяющие методы потоков. Для того чтобы потоки не продолжались бесконечно, вводим ограничения на число нарисованных фигур.
Procedure TfmThread.Paint1;
Begin
CPaint1(PaintBox1.Canvas);
Application.ProcessMessages; If N1>32000 Then T1.Terminate
End;
Создаём аналогичные процедуры для второго и третьего потоков.
Чтобы определять внутри потока метод, который нужно вызвать, добавим в класс
TNewThread переменную типа Byte.
Public
Box1 :Byte;
End;
Значение переменной Box1 определяет метод, вызываемый главным потоком.
Логика работы главного потока определяется его основным методом Execute, который необходимо переопределить.
Procedure TNewThread.Execute;
Begin
While Not Terminated Do Case Box1 Of
1:Synchronize(fmThread.Paint1);
205
PDF created with pdfFactory Pro trial version www.pdffactory.com
2:Synchronize(fmThread.Paint2);
3:Synchronize(fmThread.Paint3)
End;
If (N1>32000) And (N2>32000) And (N3>32000)
Then Begin fmThread.bbRun.Enabled := True;
fmThread.bbAbort.Enabled := False
End End;
Напишем обработчик нажатия кнопки Пуск.
Procedure TfmThread.bbRunClick(Sender: TObject);
Begin
bbRun.Enabled := False; bbAbort.Enabled := True; N1:=0; N2:=0; N3:=0;
PaintBox1.Canvas.Brush.Color:=clWhite;
PaintBox2.Canvas.Brush.Color:=clWhite;
PaintBox3.Canvas.Brush.Color:=clWhite;
PaintBox1.Canvas.Rectangle(0,0,150,150);
PaintBox2.Canvas.Rectangle(0,0,150,150);
PaintBox3.Canvas.Rectangle(0,0,150,150);
T1:=TNewThread.Create(True);
T1.Box1:=1;
T2:=TNewThread.Create(True);
T2.Box1:=2;
T3:=TNewThread.Create(True);
T3.Box1:=3;
{ ComboBox1Change(Sender);
ComboBox2Change(Sender);
ComboBox3Change(Sender); } T1.Resume;
T2.Resume;
T3.Resume
End;
206
PDF created with pdfFactory Pro trial version www.pdffactory.com
Поток создаётся с помощью конструктора, который имеет один параметр. Параметр необходимо установить равным True, если поток должен начинать работу после вызова метода Resume, или False, если поток должен начинать работу сразу после его создания.
Процедуры ComboBox1Change, ComboBox2Change и ComboBox3Change задают приоритеты соответственно первому, второму и третьему потокам. Пока эти процедуры не написаны, их вызовы необходимо закомментировать. После написания процедур фигурные скобки комментария нужно удалить.
Для наглядности работы потоков перед их запуском очищаем поверхность холстов командой, заполняющей поверхность холстов белым цветом.
Пишем обработчик нажатия кнопки, останавливающей потоки.
Procedure TfmThread.bbAbortClick(Sender: TObject);
Begin
T1.Terminate;
T2.Terminate;
T3.Terminate; bbRun.Enabled := True; bbAbort.Enabled := False
End;
Создаём три процедуры задания приоритетов, отличающиеся только номерами потоков.
Procedure TfmThread.ComboBox1Change(Sender: TObject);
Begin
Case ComboBox1.ItemIndex Of
0:T1.Priority:=tpIdle;
1:T1.Priority:=tpLowest;
2:T1.Priority:=tpLower;
3:T1.Priority:=tpNormal;
4:T1.Priority:=tpHigher;
5:T1.Priority:=tpHighest;
6:T1.Priority:=tpTimeCritical
End
End;
При создании формы задаём начальные значения приоритетов и создаём потоки, но не запускаем их.
Procedure TfmThread.FormCreate(Sender: TObject);
207
PDF created with pdfFactory Pro trial version www.pdffactory.com
Begin
Randomize;
ComboBox1.ItemIndex:=3;
ComboBox2.ItemIndex:=3;
ComboBox3.ItemIndex:=3;
T1:=TNewThread.Create(True);
T1.Box1:=1;
T2:=TNewThread.Create(True);
T2.Box1:=2; T3:=TNewThread.Create(True); T3.Box1:=3
End;
Свойству Kind кнопки Выход присвоим значение bkCustom и введём в обработчик нажатия оператор Close, чтобы остановка потоков производилась до вызова команды закрытия программы.
Procedure TfmThread.bbCloseClick(Sender: TObject);
Begin
If bbAbort.Enabled = True Then bbAbortClick(Sender); Close
End;
Текст программы на языке С++
Создаём процедуру CPaint рисования геометрических фигур: линий, кругов и квадратов. Размеры стороны квадрата и радиуса круга принимаем равными 5 пикселей. Координаты фигур и длину линий выбираем случайно в диапазоне, определяемом размерами области рисования. Цвет фигур выбираем тоже случайно.
void __fastcall TMainForm::CPaint(TCanvas *Cv)
{
int J,I; TColor C;
Cv->Brush->Style=bsSolid; C=random(16777216); J=random(30); I=random(30);
Cv->MoveTo(random(150),random(150));
208
PDF created with pdfFactory Pro trial version www.pdffactory.com
Cv->Pen->Color=clYellow; Cv->LineTo(random(150),random(150)); Cv->Pen->Color=C; Cv->Brush->Color=C; Cv->Rectangle(J*5,I*5,J*5+15,I*5+15); Cv->Brush->Color=random(16777216); Cv->Ellipse(J*5,I*5,J*5+10,I*5+10); Label1->Caption=IntToStr(n1); Label2->Caption=IntToStr(n2); Label3->Caption=IntToStr(n3);
}
Для того чтобы процедура CPaint могла быть использована для рисования на разных холстах, в заголовке процедуры объявляем переменную типа TCanvas. При вызове процедуры формальную переменную заменяем именем фактического объекта.
Для проверки и отладки работы процедуры рисования временно установим на форму таймер и с его помощью запустим процедуру CPaint для рисования на холсте PaintBox1. void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
n1=n1+1; CPaint(PaintBox1->Canvas); Application->ProcessMessages();
}
Вызов функции ProcessMessages необходим, чтобы разрешить операционной системе обрабатывать очередь сообщений для данного потока. Одновременно с отладкой процедуры CPaint проводим проверку работы счётчика числа фигур, отображающего значение переменной n1.
Если не сделать опережающее включение генератора случайных чисел, то первое случайное число всегда будет равно нулю, и, следовательно, цвет первой фигуры всегда будет чёрным. Генератор случайных чисел запускаем командой Randomize в процедуре OnCreate. Убеждаемся, что если при создании формы не включить процедуру Randomize, то первый квадратик всегда будет чёрным. После проверки работы процедуры CPaint таймер удаляем.
Затем создаём объект потока типа TNewThread. Добавление в проект объекта потока производим командой File → New ..., вызывающей диалоговое окно New Items. В диалоговом окне New Items выбираем компонент Thread Object. В диалоговом окне ввода
209
PDF created with pdfFactory Pro trial version www.pdffactory.com
New Thread Object вводим название класса, например, TNewThread. Возникнет файл с пустым описанием класса TNewThread. Файл переименовываем командой Save As..., например, в файл UnitThr.cpp.
Вфайл главной формы добавляем ссылку на заголовочный модуль потока. #include "UnitThr.h"
Вфайл потока добавляем ссылку на заголовочный модуль главной формы. #include "MainUnit.h"
Вописание класса главной формы вводим переменные для описания потоков, хранения числа фигур и регистрации запуска потоков и останова.
public: // User declarations
__fastcall TMainForm(TComponent* Owner); TNewThread *T1, *T2, *T3;
unsigned int n1,n2,n3; Byte St,Abrt;
};
Создаём основные процедуры, определяющие методы потоков: void __fastcall TMainForm::Paint1()
{
n1=n1+1; CPaint(PaintBox1->Canvas); Application->ProcessMessages();
}
void __fastcall TMainForm::Paint2()
{
n2=n2+1; CPaint(PaintBox2->Canvas); Application->ProcessMessages();
}
void __fastcall TMainForm::Paint3()
{
n3=n3+1; CPaint(PaintBox3->Canvas); Application->ProcessMessages();
}
210
PDF created with pdfFactory Pro trial version www.pdffactory.com