Программирование на С++ - eDrive

Программирование на С++ - eDrive Программирование на С++ - eDrive

edrive.narod.ru
from edrive.narod.ru More from this publisher
24.11.2014 Views

32 гур. Три кнопки должны управлять программой: первая – запускать процесс рисования, вторая – прекращать его, а третья – приостанавливать и продолжать рисование. Рекомендации 1. Бесконечное рисование. Создать проект и поместить в его форму элемент Image и кнопку, запускающую рисование. Например, окружность произвольного размера в случайной позиции формы можно нарисовать так: TImage *im = Form1–>Image1; int cx = random (im–>Width), cy = random (im–>Height), rad = random (im–>Height / 4); TRect myRect = Rect (cx – rad/2, cy – rad/2, cx + rad/2, cy + rad/2); im–>Canvas–>Ellipse (myRect); Открыв приложение, демонстрировать возможность заполнения формы серией разнокалиберных фигурок, многократно нажимая кнопку запуска. Вернуться в проект, заключить отлаженный фрагмент кода рисования в бесконечный цикл, например, while(1) { Рисование } и убедиться, что остановить его удается лишь через меню Run.Program Reset (Ctrl F2) в среде Builder C++. 2. Создание потока. Добавить в проект модуль класса потока (Thread Object) из библиотеки шаблонов (File.New…). После задания имени класса потока в поле Class Name окна диалога New thread object проект дополнится модулем, который надо подключить к форме, а форму подключить к модулю (File.Include Unit Hdr…). В шаблон исполнительной функции Execute перенести код бесконечного цикла из обработчика кнопки, включив в тело цикла выражения выхода из цикла и блокировки: void __fastcall myThread::Execute () { while (1) { if (Terminated) break; Form1–>Image1–>Canvas–>Lock (); Рисование Form1–> Image1–>Canvas–>Unlock (); } } Здесь myThread – это имя, присвоенное классу потока при его создании, Execute – автоматически созданная исполнительная функция потока, а Terminated – переменная, указывающая на прекращение выполнения пото-

33 ка. Методы Lock и Unlock управляют блокировкой доступа других потоков к канве при рисовании. 3. Запуск и завершение бесконечного цикла. Класс формы дополнить указателем на поток, например: myThread *mt; В опустевшем обработчике кнопки запуска создать поток, не запуская его (аргумент конструктора CreateSuspended = true), разрешить потоку освобождать память при завершении работы свойством FreeOnTerminate, после чего запустить поток на выполнение методом Resume: void __fastcall TForm1::Button1Click (TObject *Sender) { mt = new myThread (true); mt–>FreeOnTerminate = true; mt–>Resume (); } Поместить в форму вторую кнопку, предназначенную для завершения рисования остановкой выполнения потока методом Terminate: void __fastcall TForm1::Button2Click (TObject *Sender) { mt–>Terminate (); } Метод Terminate устанавливает в истинное значение переменную Terminated, тем самым прекращая цикл выполнения потока. Испытать приложение, убедившись в возможности управления запуском и остановкой процесса рисования. 4. Вывод текста в потоке. Поместить в форму надпись для счетчика числа нарисованных фигур. Дополнить класс потока переменной-счетчиком и функцией, выполняющей вывод в надпись значения этого счетчика, а в файле кода модуля потока определить эту функцию, например: long myCount; void __fastcall myOutput (); void __fastcall myThread::myOutput () { Form1–>Label1–>Caption = myCount++; } В исполнительную функцию потока включить вызов функции синхронизации вывода данных в потоке, применение которой исключает конфликты взаимодействия потоков: Synchronize (myOutput);

32<br />

гур. Три кнопки должны управлять программой: первая – запускать процесс<br />

рисования, вторая – прекращать его, а третья – приоста<strong>на</strong>вливать и продолжать<br />

рисование.<br />

Рекомендации<br />

1. Бесконечное рисование. Создать проект и поместить в его форму элемент<br />

Image и кнопку, запускающую рисование. Например, окружность произвольного<br />

размера в случайной позиции формы можно <strong>на</strong>рисовать так:<br />

TImage *im = Form1–>Image1;<br />

int cx = random (im–>Width), cy = random (im–>Height),<br />

rad = random (im–>Height / 4);<br />

TRect myRect = Rect (cx – rad/2, cy – rad/2, cx + rad/2, cy + rad/2);<br />

im–>Canvas–>Ellipse (myRect);<br />

Открыв приложение, демонстрировать возможность заполнения формы серией<br />

разнокалиберных фигурок, многократно <strong>на</strong>жимая кнопку запуска.<br />

Вернуться в проект, заключить отлаженный фрагмент кода рисования в<br />

бесконечный цикл, <strong>на</strong>пример,<br />

while(1) { Рисование }<br />

и убедиться, что остановить его удается лишь через меню Run.Program<br />

Reset (Ctrl F2) в среде Builder C++.<br />

2. Создание потока. Добавить в проект модуль класса потока (Thread Object)<br />

из библиотеки шаблонов (File.New…). После задания имени класса потока<br />

в поле Class Name ок<strong>на</strong> диалога New thread object проект дополнится модулем,<br />

который <strong>на</strong>до подключить к форме, а форму подключить к модулю<br />

(File.Include Unit Hdr…). В шаблон исполнительной функции Execute перенести<br />

код бесконечного цикла из обработчика кнопки, включив в тело<br />

цикла выражения выхода из цикла и блокировки:<br />

void __fastcall myThread::Execute ()<br />

{ while (1)<br />

{ if (Terminated) break;<br />

Form1–>Image1–>Canvas–>Lock ();<br />

Рисование<br />

Form1–> Image1–>Canvas–>Unlock (); } }<br />

Здесь myThread – это имя, присвоенное классу потока при его создании,<br />

Execute – автоматически создан<strong>на</strong>я исполнитель<strong>на</strong>я функция потока, а<br />

Terminated – перемен<strong>на</strong>я, указывающая <strong>на</strong> прекращение выполнения пото-

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!