Чтобы присвоить потоку относительный приоритет
Чтобы присвоить потоку относительный приоритет
Создание эффективных Win32-приложений - ДЖ. Рихтер
Команда Start допускает также ключи /BELOWNORMAL, /NORMAL, /ABOVENORMAL, /HIGH и /REALTIME, позволяющие начать выполнение программы с соответствующим классом приоритета. Разумеется, после запуска программа может вызвать SetPriority- Class и установить себе другой класс приоритета.
WINDOWS В Windows 98 команда Start не поддерживает ни один из этих ключей. Из обо- УО лочки командного процессора Windows 98 процессы всегда запускаются с классом приоритета normal.
Task Manager в Windows 2000 дает возможность изменять класс приоритета процесса. На рисунке ниже показана вкладка Processes в окне Task Manager со списком выполняемых на данный момент процессов. В колонке Base Pri сообщается класс приоритета каждого процесса. Вы можете изменить его, выбрав процесс и указав другой класс в подменю Set Priority контекстного меню.
Только что созданный поток получает относительный приоритет normal. Почему CreateThread не позволяет задать относительный приоритет — для меня так и остается загадкой. Такая операция осуществляется вызовом функции:
BOOL SetThreadPriority(
HANDLE hThread, int nPriority);
Разумеется, параметр hThread указывает на поток, чей приоритет Вы хотите изменить, а через nPriority передается один из идентификаторов (см. таблицу ниже).
Функция GetThreadPriority, парная SetThreadPriority, позволяет узнать относительный приоритет потока:
int GetThreadPriority(HANDLE hThread);
Она возвращает один из идентификаторов, показанных в таблице выше.
Чтобы создать поток с относительным приоритетом idle, сделайте, например, так:
DWORD dwThreadID;
HANDEE hThread = CreateThread^UEE, 0, ThreadFunc, NUEE,
CREATE_SUSPENDED, &dwThreadID);
SetThгeadPгioгity(hThгead, THREAD_PRIORITY_IDEE);
ResumeThгead(hThгead):
CloseHandle(hThгead):
Заметьте, что CreateThread всегда создает поток с относительным приоритетом normal. Чтобы присвоить потоку относительный приоритет idle, создайте приостановленный поток, передав в CreateThread флаг CREATE_SUSPENDED, а потом вызовите SetThreadPriority и установите нужный приоритет. Далее можно вызвать Resume- Thread, и поток будет включен в число планируемых. Сказать заранее, когда поток получит процессорное время, нельзя, но планировщик уже учитывает его новый приоритет. Выполнив эти операции, Вы можете закрыть описатель потока, чтобы соответствующий объект ядра был уничтожен по завершении данного потока.