- •Лабораторный практикум «Основы разработки приложений Windows» Книга 2
- •Часть 1. Теоретические сведения4
- •Часть 2. Лабораторный практикум73
- •Часть 1 Теоретические сведения
- •1. Основы архитектурЫ защищенного режима Регистры процессора
- •Адресация памяти
- •2. Логические шрифты Создание логических шрифтов
- •Вывод на экран текстовых строк
- •3. Таймеры Windows Организация и обслуживание таймеров
- •Мультимедийные таймеры
- •Измерение интервалов времени
- •Организация периодического процесса
- •Задание однократного интервала времени
- •4. Дочерние окна Создание и использование дочерних окон
- •Окна предопределенных классов в главном окне
- •5. Вывод растровых изображений
- •Процедура вывода растрового изображения
- •Компоновка составных изображений
- •6. Обслуживание файлов в 32-разрядных приложениях Windows
- •Базовые операции с файлами Открытие и создание файла
- •Запись и чтение файла
- •Файлы, проецируемые в память
- •7. Процессы и потоки
- •Создание дочернего процесса
- •Создание дочернего потока
- •Синхронизация потоков Общие характеристики объектов Windows
- •Синхронизация с помощью состояний потока
- •Синхронизация с помощью событий
- •Критические секции и защита данных
- •8. Библиотеки динамической компоновки
- •Часть 2 Лабораторный практикум Работы лабораторного практикума Работа 1. Создание логических шрифтов
- •Работа 2. Таймеры Windows(индивидуальное задание а)
- •Работа 3. Дочернее окно в главном окне приложения
- •Работа 4. Вывод растровых изображений с использованием совместимой памяти
- •Работа 5. Измерение временных характеристик программы с помощью мультимедийного таймера
- •Работа 6. Вывод движущихся изображений с синхронизацией от системного таймера (индивидуальное задание b)
- •Работа 7. Повышение качества движущихся изображений с помощью совместимой памяти
- •Работа 8. Движение изображения по фоновому рисунку
- •Работа 9. Работа с файлами (индивидуальное задание c)
- •Работа 10. Стандартные диалоги Windows для работы с файлами
- •Работа 11. Проецирование файла в память
- •Работа 12. Потоки (индивидуальное задание d)
- •Работа 13. Синхронизация потоков с помощью событий
- •Работа 14. Защита данных с помощью критической секции
- •Работа 15. Библиотеки динамической компоновки
- •Работа 16. Передача параметров в функции dll-библиотек
- •Индивидуальные задания лабораторного практикума
- •Задание c2.Массив записываемых в файл данных должен представлять собой последовательный ряд из 2000 целых четных чисел.
- •Лабораторный практикум «Основы разработки приложений Windows» Книга 2
Работа 11. Проецирование файла в память
Составьте программу, выполняющую проецирование созданного в работе 9 файла в память. Предусмотрите и в проекции файла, и в его отображении доступ для чтения и записи. Не забудьте преобразовать полученный вами указатель в тип, соответствующий тем данным, из которых составлен файл (int,short,BYTEи т. д.). Получив указатель на проекцию файла в памяти, модифицируйте последний элемент в файле, записав в него какое-либо легко идентифицируемое число (например, 0x12345678 для элементов типаintили 0xABCDдля элементов типаshort). С помощью программыNortonCommanderубедитесь, что файл на диске модифицирован должным образом.
Работа 12. Потоки (индивидуальное задание d)
Создайте обычное приложение Windows с главным окном, покрашенным в какой-либо цвет. В оконную функцию включите обработку сообщений WM_CREATEиWM_DESTROY. В функции обработки сообщенияWM_CREATEсоздайте с помощью функцииCreateThread()два вторичных потока с индивидуальными рабочими функциями. В функцииCreateThread()достаточно указать два параметра – имя рабочей функции потока и адрес переменной для возврата идентификатора потока; остальные параметры можно принять равными 0.
В каждой рабочей функции потока с помощью оператора whileорганизуйте бесконечный цикл до перевода в состояниеFALSEглобальной булевой переменной, которую установите в значениеTRUEперед созданием потока, и в значениеFALSE– в функцииOnDestroy(). Эти действия обеспечат завершение обоих потоков при завершения всего приложения. Включите в циклwhileвызов функцииSleep()для усыпления потока на некоторое время (0,5 – 1,5 с). В результате действия, составляющие содержание рабочих функций потоков, будут выполняться периодически и независимо с заданной для каждого потока частотой.
В рабочих функциях потоков в определенные участки главного окна приложения выводятся, в соответствии с индивидуальным заданием, некоторые символьные или графические данные. Для получения необходимого для этого контекста устройства воспользуйтесь функцией GetDC(); не забудьте, завершив вывод в окно, освободить контекст устройства вызовом функцииReleaseDC(). Вывод в окно в этом случае не сопровождается затиранием предыдущего изображения, поэтому перед выводом нового изображения старое необходимо явным образом затирать вызовом функцииFillRect(). Поскольку каждый из двух потоков выводит изображение в свою область окна, то и затирать он должен только эту область. Обязательно предусмотрите закрашивание половин окна разными цветами, чтобы они наглядно различались. Координаты всей рабочей области окна можно получить посредством функцииGetClientRect(); из этих данных нетрудно вычислить координаты требуемой половины окна (верхней, нижней, правой или левой).
Работа 13. Синхронизация потоков с помощью событий
Модифицируйте программу из предыдущей работы. Включите в проект файл ресурсов с описанием меню, состоящего из четырех пунктов для включения и выключения каждого из двух потоков.
В функции OnCreate(), наряду с двумя потоками, создайте два объекта событий, сохранив в глобальных переменных их дескрипторы. Оба события создаются со сбросом вручную, их начальное состояние лучше задать сброшенным, чтобы при запуске программы выполнение потоков было заблокировано.
В функции OnCommand()обработки сообщенийWM_COMMANDот пунктов меню с помощью конструкцииswitch-caseанализируйте код выбранного пункта и вызовом функцийSetEvent()иResetEvent()устанавливайте или сбрасывайте соответствующие события.
В начале фрагмента циклического выполнения каждого потока поместите функции WaitForSingleObject()ожидания “своего” события. Теперь выбором пунктов меню можно независимо запускать или останавливать оба ваших потока.