
- •Процессы и задачи в Microsoft Windows
- •Запуск задач
- •Управление запущенными задачами
- •Изменение приоритета задачи
- •Определение приоритета задачи
- •Приостановка и возобновление выполнения задачи
- •Временная приостановка работы задачи
- •Завершение задачи
- •Освобождение идентификатора задачи
- •Критические секции
- •Инициализация критической секции
- •Удаление критической секции
- •Вход в критическую секцию и выход из нее
- •4. Контрольные вопросы
- •5. Содержание работы
- •Создание объекта - событие
- •Открытие объекта - событие
- •Управление состоянием объекта - событие
- •Объекты – событие с автосбросом
- •Создание объекта Mutex
- •Освобождение идентификатора объекта Mutex
- •Открытие объекта Mutex
- •Как завладеть объектом Mutex
- •Освобождение объекта Mutex
- •Как работает семафор
- •Функции для работы с семафорами
- •Создание семафора
- •Уничтожение семафора •
- •Увеличение значения счетчика семафора
- •Уменьшение значения счетчика семафора
- •Определение текущего значения счетчика семафора
- •Создание и открытие ожидаемого таймера
- •Функции для работы с ожидаемым таймером
- •Контрольные вопросы
- •Содержание работы
- •Содержание отчета
- •Теоретический материал
- •7.1. Универсальные функции для работы с файлами в операционных системах Microsoft Windows
- •Функция CreateFile
- •Функция CloseHandle
- •Функции ReadFile и WriteFile
- •Механизм отображения файлов на память
- •Создание отображения файла
- •Выполнение отображения файла в память
- •Открытие отображения
- •Отмена отображения файла
- •Принудительная запись измененных данных
- •Обмен через файлы, отображаемые на память
- •Пример приложения, использующего файлы, отображаемые на память
- •Именованные и анонимные каналы
- •Имена каналов
- •Реализации каналов
- •Создание канала
- •Установка соединения с каналом со стороны сервера
- •Пример приложения, использующего каналы передачи данных Pipes
- •Создание канала Mailslot
- •Открытие канала Mailslot
- •Запись сообщений в канал Mailslot
- •Чтение сообщений из канала Mailslot
- •Определение состояния канала Mailslot
- •Изменение состояния канала Mailslot
- •Пример приложения, использующего каналы передачи данных MailSlot
- •Пример приложения, использующего передачу сообщений между процессами
Создание и открытие ожидаемого таймера
Чтобы создать ожидаемый таймер, необходимо вызвать функцию CreateWaitableTimer:
HANDLE CreateWaitableTimer( |
|
|
|
LPSECURITY_ATTRIBUTES lpSecurityAttributes |
// атрибуты защиты |
|
BOOL fManualReset, |
// тип ожидаемого таймера |
|
LPCTSTR IpName); |
// имя ожидаемого таймера |
В качестве атрибутов защиты вы можете передать значение NULL.
По аналогии с объектами - событиями параметр fManualReset определяет тип ожидаемого таймера: со сбросом вручную или с автосбросом. Когда освобождается таймер со сбросом вручную, возобновляется выполнение всех потоков, ожидавших этот объект, а когда в свободное состояние переходит таймер с автосбросом - лишь одного из потоков.
Через параметр IpName вы должны передать указатель на имя объекта – событие. Это имя не должно содержать символ "\" и его длина не должна превышать значение МАХ_РАТН.
Для открытия ранее созданного ожидаемого таймера необходимо использовать функцию OpenWaitableTimer:
HANDLE OpenWaitableTimer( |
|
|
|
DWORD fdwAccess, |
// требуемый доступ |
|
BOOL fInherit, |
// флаг наследования |
|
LPCTSTR IpName ); |
// адрес имени ожидаемого таймера |
Флаги доступа, передаваемые через параметр fdwAccess, определяют требуемый уровень доступа к ожидаемому таймеру и могут принимать следующие значения:
TIMER_ALL_ACCESS |
Разрешает полный доступ к объекту |
TIMER_MODIFY_ STATE |
Разрешает изменять состояние таймера функциями SetWaitableTimer и CancelWaitableTimer |
SYNCHRONIZE |
Только Windows NT – разрешает использовать таймер в функциях ожидания |
Параметр fInherit определяет возможность наследования полученного идентификатора. Если этот параметр равен TRUE, идентификатор может наследоваться дочерними процессами. Если же он равен FALSE, наследование не допускается.
Через параметр lpName вы должны передать функции адрес символьной строки, содержащей имя ожидаемого таймера.
Функции для работы с ожидаемым таймером
Объекты «ожидаемый таймер» всегда создаются в занятом состоянии. Чтобы сообщить таймеру, в какой момент он должен перейти в свободное состояние, вызовите функцию SetWaitableTimer:
BOOL SetWaitableTimer( |
|
|
|
HANDLE hTimer, |
// идентификатор ожидаемого таймера |
|
Const LARGE_INTEGER lpDueTime, |
// время срабатывания |
|
LONG lPeriod, |
// период повторения срабатывания |
|
PTIMERAPCROUTINE pfnCompletionRoutine, |
// процедура-обработчик |
|
PVOID lpArgToCotnpletionRoutine, |
// параметр процедуры-обработчика |
|
BOOI fResume); |
// задает, будет ли операцион-ная система // «пробуждаться» из suspended режима |
Параметр lpDueTime задает время срабатывания таймера. Время задается в формате FILETIME и базируется на coordinated universal time (UTC), т.е. должно указываться по Гринвичу. Для преобразования системного времени в FILETIME используется функция SystemTimeToFileTime. Если время имеет положительный знак, оно трактуется как абсолютное, если отрицательный – как относительное от момента запуска таймера.
Параметр lPeriod задает срок между повторными срабатываниями таймера. Если lPeriod равен 0 – таймер сработает один раз.
Параметр pfnCompletionRoutine задает адрес функции, объявленной как:
VOID APIENTRY TimerAPCRoutine( |
|
|
|
PVOID pvArgToCompleUonRoutine, |
|
|
DWORD dwTimerLowValue, |
|
|
DWORD dwTimerHighValue) |
|
Эта функция вызывается, когда срабатывает таймер, если поток, ожидающий его срабатывания, использует функцию ожидания, поддерживающую асинхронный вызов процедур. В функцию передаются 3 параметра:
lpArgToCompletionRoutine – значение, переданное в качестве одноименного параметра в функцию SetWaitableTimer. Приложение может использовать его для передачи в процедуру обработки адреса блока данных, необходимых для её работы
dwTimerLowValue и dwTimerHighValue – соответственно члены dwLowDateTime и dwHighDateTime структуры FILETIME. Они описывают время срабатывания таймера. Время задается в UTC формате (по Гринвичу).
Если дополнительная функция обработки не нужна, в качестве этого параметра можно передать NULL.
Параметр lpArgToCompletionRoutine передается в функцию pfnCompletionRoutine при её вызове.
Параметр fResume определяет необходимость “пробуждения” системы, если на момент срабатывания таймера она находится в режиме экономии электроэнергии (suspended). Если операционная система не поддерживает пробуждение и fResume равно TRUE, функция SetWaitableTimer выполнится успешно, однако последующий вызов GetLastError вернет результат ERROR_NOT_SUPPORTED.
Для перевода таймера в неактивное состояние, необходимо использовать функцию CancelWaitableTimer:
BOOL CancelWaitableTimer(HANDLE hTimer);
Данная функция использует идентификатор таймера и отменяет его (таймер), после чего тот уже никогда не сработает, - если только вы не переустановите его повторным вызовом SetWaitableTimer. Если Вам понадобится перенастроить таймер, то вызывать CancelWattableTimer перед повторным обращением к SetWaitableTimer не требуется; так как каждый вызов SetWaitableTimer автоматически отменяет предыдущие настройки перед установкой новых.
Номер варианта
Последняя цифра зачетной книжки |
|||||||||
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Номер варианта |
|||||||||
6 |
2 |
4 |
5 |
10 |
8 |
1 |
7 |
3 |
9 |
Варианты заданий
Номер варианта |
Задание для выполнения |
1 |
Синхронизация задач одного MDI-приложения с помощью безымянного объекта Mutex |
2 |
Синхронизация задач нескольких MDI-приложений с помощью ожидаемого таймера с автосбросом, который срабатывает через промежутки времени равные 1,5 секундам |
3 |
Синхронизация задач одного MDI-приложения с помощью безымянного объекта Semaphore, со значением счетчика равным 4 |
4 |
Синхронизация задач одного SDI-приложения с помощью ожидаемого таймера с ручным сбросом, который срабатывает через произвольные промежутки времени не превышающие 2 секунд |
5 |
Синхронизация задач нескольких SDI-приложений с помощью объекта - события с ручным сбросом |
6 |
Синхронизация задач нескольких SDI-приложений с помощью объекта Mutex |
7 |
Синхронизация задач нескольких SDI-приложений с помощью ожидаемого таймера с ручным сбросом, который срабатывает через равные промежутки времени, равные 2 секундам. |
8 |
Синхронизация задач нескольких SDI-приложений с помощью объекта-события с автосбросом |
9 |
Синхронизация задач нескольких MDI-приложений с помощью объекта Semaphore с возможностью задания значения счетчика Semaphore |
10 |
Синхронизация задач одного MDI-приложения с помощью ожидаемого таймера с автосбросом, который срабатывает через произвольные интервалы времени не превышающие 3 секунд |
Лабораторная работа №3
«Передача данных между процессами в операционных системах Microsoft Windows»
Цель занятия
Изучение способов передачи данных между процессами в операционных системах Microsoft Windows.
Литература
1.Фролов А.В., Фролов Г.В. Программирование для Windows NT. – М: ДИАЛОГ-МИФИ, 1996. – 272 с. – (Библиотека системного программиста; Т.26).
2.Фролов А.В., Фролов Г.В. Операционная система Windows 95 для программиста. – М: ДИАЛОГ-МИФИ, 1996. – (Библиотека системного программиста; Т.22).
3.Фролов А.В., Фролов Г.В. Графический интерфейс GDI в Microsoft Windows. – М: ДИАЛОГ-МИФИ, 1994. – (Библиотека системного программиста; Т.14).
4.Саймон Р. Windows 2000 API Энциклопедия. – М: ДиаСофт, 2002.- 1088 с.
5.Неббет Г. Справочник по базовым функциям API Windows NT/2000. – М: Вильямс, 2002. – 528 с.
Выполнение работы
Изучить универсальные функции Windows API: CreateFile, WriteFile, ReadFile;
изучить способы передачи информации между процессами в операционных системах Microsoft Windows:
обмен через файлы, отображаемые на память;
обмен с помощью передачи сообщений;
канал передачи данных Pipe;
канал передачи данных MailSlot.
разработать алгоритм работы учебного приложения;
программно реализовать учебное приложение;
отладить работу, разработанного приложения;
составить отчет по проделанной работе в соответствии с требованиями, предъявляемыми в пункте 6 настоящего пособия.