- •Лабораторная работа № 2 потоки и работа с ними в операционной системе windows
- •Теоретические сведения
- •Создание потока
- •Приостановка потока
- •Возобновление потока
- •Завершение потока
- •Коды завершения в ос Windows
- •Установка приоритета потока
- •Относительные приоритеты потоков
- •Получение приоритета потока
- •Все функции работы с потоками
- •Пример работы с потоками
- •Программа работы
Коды завершения в ос Windows
Код |
Значение |
0 |
The operation completed successfully (EXIT_SUCCESS) |
1 |
Incorrect function. EXIT_FAILURE |
2 |
The system cannot find the file specified. |
3 |
The system cannot find the path specified. |
4 |
The system cannot open the file. |
5 |
Access is denied. |
6 |
The handle is invalid. |
7 |
The storage control blocks were destroyed. |
8 |
Not enough storage is available to process this command. |
9 |
The storage control block address is invalid. |
10 |
The environment is incorrect. |
11 |
An attempt was made to load a program with an incorrect format. |
12 |
The access code is invalid. |
13 |
The data is invalid. |
14 |
Not enough storage is available to complete this operation. |
15 |
The system cannot find the drive specified. |
16 |
The directory cannot be removed. |
Установка приоритета потока
Функция SetThreadPriority устанавливает значение приоритета для заданного потока. Это значение, вместе с классом приоритета процесса потока, обуславливает базовый уровень приоритета потока.
Синтаксис
BOOL SetThreadPriority(
HANDLE hThread, // дескриптор потока
int nPriority¶¶ // уровень приоритета потока
);
Параметры
hThread – дескриптор потока, значение приоритета которого должно быть установлено. В Windows NT/2000/XP дескриптор должен иметь право доступа THREAD_SET_INFORMATION связанное с ним.
nPriority – значение приоритета для потока. Этот параметр может быть одним из следующих значений:
Таблица №2
Относительные приоритеты потоков
Приоритет |
Значение |
THREAD_PRIORITY_ABOVE_NORMAL |
Приоритет на 1 пункт выше класса приоритета. |
THREAD_PRIORITY_BELOW_NORMAL |
Приоритет на 1 пункт ниже класса приоритета. |
THREAD_PRIORITY_HIGHEST |
Приоритет на 2 пункта выше класса приоритета. |
THREAD_PRIORITY_IDLE |
Базовый приоритет 1 для всех классов приоритетов процессов за исключением класса REALTIME_PRIORITY_CLASS. Для него уровень базового приоритета 16 |
THREAD_PRIORITY_LOWEST |
Приоритет на 2 пункта ниже класса приоритета. |
THREAD_PRIORITY_NORMAL |
Нормальный приоритет класса приоритета. |
THREAD_PRIORITY_TIME_CRITICAL |
Базовый приоритет 15 для всех классов приоритетов процессов за исключением класса приоритета REALTIME_PRIORITY_CLASS. Для него уровень базового приоритета 16 |
Windows 2000/XP: этот параметр может быть также -7, -6, -5, -4, -3, 3, 4, 5, или 6.
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - не ноль.
Если функция завершается с ошибкой, величина возвращаемого значения - ноль. Чтобы получать дополнительные информацию об ошибке необходимо вызвать функцию GetLastError.
Каждый поток имеет базовый уровень приоритета, определяемый значением приоритета потока и классом приоритета его процесса. Система использует базовый уровень приоритета всех исполняемых потоков, чтобы установить, который поток получает следующий квант процессорного времени. Потокам устанавливается очередность обслуживания циклическим способом в каждом уровне приоритета, и только тогда, когда нет никаких выполняемых потоков на более высоком уровне, происходит диспетчеризация потоков на более низком уровне.
Функция SetThreadPriority дает возможность установки базового уровня приоритета потока относительно класса приоритета его процесса. Например, устанавливая THREAD_PRIORITY_HIGHEST при вызове SetThreadPriority для потока процесса IDLE_PRIORITY_CLASS базовый уровень приоритета потока устанавливается в значение 6.
Для процессов IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS и HIGH_PRIORITY_CLASS, система динамически повышает (форсирует) базовый уровень приоритета потока, когда происходят события, которые являются важными для потока. Процессы REALTIME_PRIORITY_CLASS не получают динамического форсирования.
Все потоки вначале запускаются как THREAD_PRIORITY_NORMAL. Используйте функции GetPriorityClassиSetPriorityClass, чтобы получать и устанавливать класс приоритета процесса. Используйте функциюGetThreadPriority, чтобы получить значение приоритета потока.
Используйте класс приоритета процесса, чтобы различать между прикладными программами те, которые являются критическими по времени исполнения и те, которые требуют нормальной или ниже нормальной очередности обслуживания. Используйте значения приоритета потока, чтобы различать относительные приоритеты задач процесса. Например, поток, который обрабатывает ввод данных для окна, может иметь более высокий уровень приоритета, чем поток, который выполняет интенсивные вычисления для ЦПУ.
При управлении приоритетами, будьте очень осторожными, чтобы гарантировать, что высокоприоритетный поток не поглотит все доступное процессорное время. Поток с базовым уровнем приоритета более чем 11 мешает нормальным операциям операционной системы. Использование REALTIME_PRIORITY_CLASS может стать причиной, что буферы системы ввода-вывода не станут сбрасывать на диск, зависание мыши, и так далее.