- •Лабораторная работа № 1
- •1. Теоретические сведения
- •2. Задания к лабораторной работе Задание 1.1. Создание простого Windows-приложения
- •Задание 1.2. Модификация простого Windows-приложения
- •Задание 2. Создание консольного приложения
- •Задание 3.1. Использование tThread для разработки потоков команд
- •Задание 3.2. Создание нескольких потоков
- •Контрольные вопросы
Лабораторная работа № 1
Введение в Borland C++ Builder. Многопоточные приложения
Цель: изучить среду разработки Borland C++ Builder, научиться создавать Windows- и консольные приложения.
1. Теоретические сведения
1.1. Borland C++ Builder. Фирма Borland (Inprise), специализирующаяся на разработке инструментальных средств, создала мощное средство визуальной разработки Windows приложений – Borland C++ Builder. Ключ к пониманию приложения, разработанного в среде Borland C++ Builder лежит в понимании работы компонент из библиотеки классов визуальных компонент (VCL).
Каждый визуальный компонент представляет собой класс C++, который имеет так называемые свойства (properties), задающие параметры данного компонента, например цвет или заголовок. Каждое Windows-приложение состоит, по крайней мере, из одного компонента ‑ формы, т.е. окна приложения. Каждой форме соответствует заголовочный файл с расширением*.hс описанием производного от базового классаTFormкласса данной формы (по умолчаниюTForm1), файл с расширением*.cpp c определениями функций-членов классаTForm1и файл формы с расширением*.dfm. Кроме того, проект включает файлы ресурсов (*.res) и одноименные *.makи*.cppфайлы главного модуля (Project Source). Когда Windows посылает сообщения элементу управления, то происходит вызов метода класса формы, содержащей этот управляющий элемент. Поэтому обработка сообщений сводится к перекрытию соответствующих методов класса формы или установке специальных свойств экземпляра управляющего класса на функцию обработки события. Это облегчается еще и тем, что Borland C++ Builder автоматически настраивает эти свойства, одновременно создавая шаблоны соответствующих методов обработки в классе формы по желанию программиста посредством интуитивно понятного интерфейсаObject Inspector.
1.2. Среда разработки Borland C++ Builder.Когда Borland C++ Builder загружается, на экране отображаются четыре окна:
главное окно с заголовком C++ Builder-Project1, содержащее меню, панель горячих кнопок и палитру компонентов;
окно инспектора объектов, который позволяет просматривать свойства визуальных компонентов, помещенных на форму, а так же их обработчики событий;
окно формы, помеченное Form1;
окно модуля с названием Unit.cpp, которое первоначально перекрыто окном формы.
1.3. Класс TThread.В библиотеку Borland C++ Builder входит классTThread, который предназначен для создания и управления потоками команд (нитями) внутри основного процесса. Этот класс также имеет методы, позволяющие синхронизировать Windows GUI в тех случаях, когда необходимо организовать обращение к функциям графического интерфейса из дочернего потока команд. Основная концепция Borland C++ Builder в отношении организации параллельных процессов (потоков), заключается в рассмотрении потока команд как экземпляра класса. Поэтому далее мы рассматриваем потоки в смысле экземпляров классов, производных (наследуемых) от базового классаTThread.
TThreadявляется базовым классом по отношению к потокам, создаваемым пользователем. Программист должен сам создать класс, производный отTThread, и перекрыть (модифицировать) методExecute()для того, чтобы определить, какой именно код будет выполняться в дочернем потоке. Иногда бывает полезно перекрыть и конструктор производного класса для передачи потоку необходимого списка параметров.
Поток команд, составляющих тело функции-члена Execute(), запускается сразу после создания экземпляра классаTThread, если этот экземпляр создан конструктором с параметромfalse. Если параметр конструктора ‑true, то поток не запускается и находится в приостановленном состоянии (suspended), пока не будет вызван метод классаTThread::Resume(). Кроме того, имеется методSuspend(), который может приостановить выполняющийся поток команд до тех пор, пока не будет вызван методResume()того же потока.
Для синхронизации дочерних потоков с основным применяется метод WaitFor(). Функция-член экземпляра класса (дочернего потока)WaitFor() не возвращает никакого значения до тех пор, пока не завершится выполнение всех команд данного потока.