Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ТВП ЛР A5.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
611.84 Кб
Скачать

Управление запущенными задачами

После того как задача запущена, запустившая задача знает идентификатор дочерней задачи. Пользуясь этим идентификатором, запустившая задача может управлять состоянием дочерней задачи, изменяя ее приоритет, приостанавливая, возобновляя или завершая ее работу.

Изменение приоритета задачи

Родительская задача может изменить отно­сительныйприоритет запущенной ей дочерней задачи с помощью функции 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