
- •А.Ю. Быков
- •Быков Александр Юрьевич
- •Подхода
- •Оглавление
- •Введение
- •1. Лабораторная работа № 1. Изучение диалоговых окон и элементов управления в Win api
- •1.1. Цель и задачи работы, требования к результатам ее выполнения
- •1.2. Краткая характеристика объекта изучения
- •1.2.1. Классификация диалоговых окон
- •1.2.2. Окна сообщений
- •1.2.3. Создание модального диалогового окна
- •1.2.4. Элементы управления диалогового окна
- •Кнопка, контрольный переключатель, радио кнопка
- •Текстовое поле
- •Примеры
- •Примеры посылки сообщений списку
- •1.3. Задачи и порядок выполнения работы
- •Пример выполнения работы
- •1.4. Форма отчета по лабораторной работе
- •1.5. Вопросы для самоконтроля
- •2.1. Цель и задачи работы, требования к результатам ее выполнения
- •2.2. Краткая характеристика объекта изучения
- •2.2.1. Понятие класса и объекта
- •2.2.2. Доступность компонент класса
- •2.2.3. Основные элементы класса Компонентные данные и функции класса
- •Конструктор класса
- •Деструктор класса
- •2.3. Задачи и порядок выполнения работы
- •Пример выполнения работы
- •2.4. Форма отчета по лабораторной работе
- •2.5. Вопросы для самоконтроля
- •3.1. Цель и задачи работы, требования к результатам ее выполнения
- •3.2. Краткая характеристика объекта изучения
- •3.3. Задачи и порядок выполнения работы
- •Пример выполнения работы
- •3.4. Форма отчета по лабораторной работе
- •4.2.3. Особенности конструкторов при наследовании
- •4.2.4. Особенности деструкторов при наследовании
- •4.2.5. Переопределение функций. Виртуальные функции
- •4.3. Задачи и порядок выполнения работы
- •Пример выполнения работы
- •4.4. Форма отчета по лабораторной работе
- •5.3. Задачи и порядок выполнения работы
- •Пример выполнения работы
- •5.4. Форма отчета по лабораторной работе
- •6.2.2. Создание потока с помощью api – функций
- •6.2.3. Синхронизация потоков
- •1. Взаимное исключение.
- •3. Семафор
- •4. Событие
- •6.2.4. Синхронизация процессов
- •6.3. Задачи и порядок выполнения работы
- •Пример выполнения работы
- •6.4. Форма отчета по лабораторной работе
- •6.5. Вопросы для самоконтроля
- •7. Лабораторная работа № 7. Изучение библиотеки классов mfc
- •7.1. Цель и задачи работы, требования к результатам ее выполнения
- •7.2. Краткая характеристика объекта изучения
- •7.2.1. Обзор упрощенной иерархии классов библиотеки mfc
- •7.2.2. Состав простейшего приложения в mfc
- •7.2.3. Обработка сообщений в mfc
- •Некоторые функции обработчики
- •7.2.4. Вывод графики в mfc
- •Графические объекты
- •Добавление обработчиков сообщений и событий в однодокументном приложении
- •Вывод графики и перерисовка
- •7.3. Задачи и порядок выполнения работы
- •Пример выполнения работы
- •7.4. Форма отчета по лабораторной работе
- •7.5. Вопросы для самоконтроля
- •8. Лабораторная работа № 8. Изучение разработки приложений для платформы Microsoft .Net с использование библиотеки классов .Net Framework
- •8.1. Цель и задачи работы, требования к результатам ее выполнения
- •8.2. Краткая характеристика объекта изучения
- •8.2.1. Обзор платформы Microsoft .Net
- •8.2.2. Единая среда исполнения
- •8.2.4. Понятие управляемого кода
- •8.2.6. Система общих типов
- •8.2.7. Обзор библиотеки классов .Net Framework
- •8.2.8. Класс Form
- •8.2.9. Обработка событий
- •8.2.10. Основные элементы управления
- •8.4. Форма отчета по лабораторной работе
- •8.5. Вопросы для самоконтроля
- •Заключение
- •Рекомендуемые источники
- •Приложение а. Варианты заданий для выполнения лабораторных работ Варианты заданий для лабораторной работы № 1
- •Варианты заданий для лабораторной работы № 2
- •Варианты заданий для лабораторной работы № 3
- •Варианты заданий для лабораторной работы № 4
- •Варианты заданий для лабораторной работы № 5
- •Варианты заданий для лабораторной работы № 6
- •Часть I
- •Часть II
- •Варианты заданий для лабораторной работы № 7
- •Варианты заданий для лабораторной работы № 8
6.2.3. Синхронизация потоков
Проблема синхронизации возникает, когда 2 или более потока пытаются «одновременно» получить доступ к одним и тем же данным (или одному объекту).
Объекты синхронизации и их назначение представлены в таблице 2.
Примеры использования объектов синхронизации:
1. Взаимное исключение.
HANDLE HMutex; // Объявляется глобально, и все потоки имеют доступ
HMutex=CreateMutex( // Создание взаимного исключения
NULL, // атрибуты прав доступа по умолчанию
FALSE, // Взаимное исключение изначально свободно
NULL); // не присваивается имя взаимному исключению
Работа с синхронизированным объектом:
WaitForSingleObject(HMutex, // Занять взаимное исключение
Таблица 2 – Объекты синхронизации и их назначение
Синхронизирующий объект |
Назначение |
Используемые функции Win32 API |
Взаимное исключение |
Запрет доступа более чем одному потоку к общим ресурсам |
CreateMutex WaitForSingleObject WaitForMultipleObjects ReleaseMutex CloseHandle |
Критическая секция |
Запрет доступа более чем одному потоку к одному фрагменту кода |
InitializeCriticalSection EnterCriticalSection LeaveCriticalSection DeleteCriticalSection |
Семафор |
Ограничение числа потоков, имеющих одновременный доступ к общим ресурсам |
CreateSemaphore WaitForSingleObject WaitForMultipleObjects ReleaseSemaphore CloseHandle |
Событие |
Позволяет потоку передавать сигналы другим потокам |
CreateEvent SetEvent PulseEvent ResetEvent WaitForSingleObject WaitForMultipleObjects CloseHandle |
INFINITE); // ждите сколько нужно
Count++; // Работа с синхронизированным объектом
ReleaseMutex(HMutex); // Освободить взаимное исключение
Удалить взаимное исключение:
CloseHandle(HMutex);
Рассмотрим функции WaitForSingleObject и WaitForMultipleObjects. WaitForSingleObject имеет заголовок:
DWORD WaitForSingleObject( HANDLE hObject, DWORD dwMilliseconds);
Когда поток вызывает эту функцию, первый параметр hObject идентифицирует объект ядра (объекты «Взаимное исключение», «Семафор» и «Событие» являются объектами ядра Windows [4]), поддерживающий состояния «свободен- занят». Второй параметр dwMilliseconds указывает, сколько времени (в миллисекундах) поток готов ждать освобождения объекта, значение INFINITE означает ждать без ограничения времени. При выходе из функции она возвращает значение, которое можно использовать:
WAIT_OBJECT_0 – объект свободен;
WAIT_TIMEOUT – заданное время ожидания (таймаут) истекло;
WAIT_ FAILED – неверное значение параметра.
Функция WaitForMultipleObjects аналогична WaitForSingleObject, но она позволяет ждать освобождения сразу нескольких объектов или какого-то одного из них. Заголовок функции:
DWORD WaitForMultipleObjects( DWOHD dwCount, CONST HANDLE* phObjects, BOOL fWaitAll, DWORD dwMilliseconds);
Параметр dwCount определяет число ожидаемых объектов ядра, его значение в пределах от 1 до MAXIMUM_WAIT_OBJECTS (в заголовочных файлах Windows оно определено как 64). Параметр phObject – указатель на массив объектов ядра.
WaitForMultipleObjects приостанавливает поток и заставляет его ждать освобождения либо всех заданных объектов ядра, либо одного из них. Параметр fWaitAll это определяет, если он равен TRUE, функция не даст потоку возобновить свою работу, пока не освободятся все объекты, если FALSE, то достаточно освободиться хотя бы одному объекту.
Параметр dwMilliseconds идентичен одноименному параметру функции WaitForSingleObject.
2. Критическая секция – это фрагмент программы, защищенный от одновременного выполнения несколькими потоками. Критическую секцию в данный момент может выполнять только один поток.
InitializeCriticalSection – данная функция создает объект под названием критическая секция. Параметры функции:
указатель на структуру CRITICAL_SECTION.
Поля данной структуры используются только внутренними процедурами, их смысл безразличен.
EnterCriticalSection – войти в критическую секцию. После выполнения этой функции данный поток становится владельцем данной секции. Следующий поток, вызвав данную функцию, будет находиться в состоянии ожидания. Параметр функции такой же, что и в предыдущей функции.
LeaveCriticalSection – покинуть критическую секцию. После этого второй поток, который был остановлен функцией EnterCriticalSection, станет владельцем критической секции. Параметр функции LeaveCriticalSection такой же, как и у предыдущих функций.
DeleteCriticalSection – удалить объект "критическая секция". Параметр аналогичен предыдущим.