- •Процессы и задачи в 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
- •Пример приложения, использующего передачу сообщений между процессами
Управление запущенными задачами
После того как задача запущена, запустившая задача знает идентификатор дочерней задачи. Пользуясь этим идентификатором, запустившая задача может управлять состоянием дочерней задачи, изменяя ее приоритет, приостанавливая, возобновляя или завершая ее работу.
Изменение приоритета задачи
Родительская задача может изменить относительныйприоритет запущенной ей дочерней задачи с помощью функции SetThreadPriority:
BOOL SetThreadPriprity( |
|
|
|
HANDLE hThread, |
// идентификатор задачи |
|
int nPriority); |
// новый уровень приоритета задачи |
Через параметр hThread этой функции передается идентификатор задачи, для которой необходимо изменить относительный приоритет. Новое значение относительного приоритета передается через параметр nPriority и может принимать одно из следующих значений:
THREAD_PRIORITY_TIME_CRITICAL;
THREAD_PRIORITY_HIGHEST;
THREAD_PRIORITY_ABOVE_NORMAL;
THREAD_PRIORITY_NORMAL;
THREAD_PRIORITY_BELOW_NORMAL;
THREAD_PRIORITY_LOWEST;
THREAD_PRIORITY_IDLE.
Абсолютный уровень приоритета, который получит задача, зависит от класса приоритета процесса.
Определение приоритета задачи
Зная идентификатор задачи, нетрудно определить ее относительный приоритет. Для этого следует воспользоваться функцией GetThreadPriority:
int GetThreadPriority(HANDLE hThread);
Эта функция возвращает одно из значений, перечисленных выше в пункте "Изменение приоритета задачи", или значение THREAD_PRIORITY_ERROR_RETURN при возникновении ошибки.
Приостановка и возобновление выполнения задачи
В некоторых случаях имеет смысл приостановить выполнение задачи. Например, если пользователь работает с многооконным приложением и для каждого окна запускается отдельная задача, для повышения производительности можно приостановить выполнение задач в неактивных окнах.
Приостановка выполнения задачи делается с помощью функции SuspendThread:
DWORD SuspendThread(HANDLE hThread);
Через единственный параметр этой функции нужно передать идентификатор приостанавливаемой задачи.
Для каждой задачи операционная система хранит счетчик приостановок, который увеличивается при каждом вызове функции SuspendThread. Если значение этого счетчика больше нуля, задача приостанавливается.
Для уменьшения значения счетчика приостановок и, соответственно, для возобновления выполнения задачи вы должны использовать функцию ResumeThread:
DWORD ResumeThread(HANDLE hThread);
В случае ошибки функции SuspendThread и ResumeThread возвращают значение 0xFFFFFFFF.
Временная приостановка работы задачи
С помощью функции Sleep задача может приостановить свою работу на заданный период времени:
VOID Sleep (DWORD cMilliseconds); // время в миллисекундах
Задача, выполняющая ожидание с помощью этой функции, не снижает производительности системы, так как ей не распределяются кванты времени. Через единственный параметр вы можете задать функции время ожидания в миллисекундах.
Если для времени ожидания указать нулевое значение, то при наличии в системе запущенных задач с таким же приоритетом, как и у задачи, вызвавшей эту функцию, ожидающая задача отдает оставшееся время от своего кванта другой задаче, В том случае, когда в системе нет других задач с таким же значением приоритета, функция Sleep немедленно возвращает управление вызвавшей ее задаче, которая сама будет использовать остаток своего кванта времени.
Есть еще одна возможность: можно организовать бесконечную задержку, передав функции Sleep значение INFINITE
