Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум «Основы разработки приложений Windows» книга 2.DOC
Скачиваний:
91
Добавлен:
10.05.2014
Размер:
827.9 Кб
Скачать

Работа 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()ожидания “своего” события. Теперь выбором пунктов меню можно независимо запускать или останавливать оба ваших потока.