Программирование на С++ - eDrive
Программирование на С++ - eDrive Программирование на С++ - eDrive
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);
- Page 1 and 2: Федеральное агентс
- Page 3 and 4: Содержание Общие т
- Page 5 and 6: Кнопка управления
- Page 7 and 8: { for (int i = 0; i < gridRows; ++i
- Page 9 and 10: 9 void MySwap (double &a, double &b
- Page 11 and 12: 11 Для статистическ
- Page 13 and 14: 13 Задачи 1. Заменить
- Page 15 and 16: double stat = *max_element (myVecto
- Page 17 and 18: 17 подготовленным п
- Page 19 and 20: 19 for (int i=0; iColCount; ++i) f
- Page 21 and 22: 21 ADO панели визуаль
- Page 23 and 24: 23 В этом фрагменте
- Page 25 and 26: TImage *im; TSearchRec sr; 25 Ин
- Page 27 and 28: 27 Работа 11. Програм
- Page 29 and 30: 29 Series1->Assign (myForm1->Series
- Page 31: 31 а в деструкторе у
- Page 35 and 36: 35 Рекомендации 1. Ст
- Page 37 and 38: 37 10. Подключение сп
- Page 39 and 40: 39 требуемый заголо
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> прекращение выполнения пото-