PureBasic

ThreadPriority()

Синтаксис

OldPriority = ThreadPriority(Thread , Priority)

Описание


Изменяет приоритет указанного потока и возвращает прежний приоритет.

Значение приоритета может быть от 1 до 32. 1 это самый низкий доступный приоритет, 16 это обычный приоритет и 32 это приоритет "критичный ко времени" (time critical priority) (наивысший, пожалуйста, не используйте его если не знаете что делаете).

Если параметр Priority равен 0, приоритет не изменяется (полезно только для получения приоритета потока без его изменения). Все потоки создаются с обычным приоритетом.

В типичном случае вы задаёте для потока, который постоянно работает (например, поток обработки изображения) приоритет, который не превышает приоритет любого другого потока в вашей системе. Основание так поступить в том, что если поток постоянно работает и имеет высокий приоритет, то никакой другой поток не получит шанса выполниться. Если поток должен быстро реагировать, но проводит много времени в ожидании события, вам стоит рассмотреть задание ему повышенного приоритета.

Windows управляет потоками (выбирает, какой будет работать в следующий короткий интервал времени) используя стратегию вытесняющих приоритетов, с закольцованной очередью внутри каждого уровня приоритета. Это означает, что если пришло время выполнять другой поток (также называется переключение контекста), то следующим на выполнение станет поток с наивысшим приоритетом среди ожидающих. Если среди ожидающих выполнения потоков более одного с наивысшим приоритетом, то последующие переключения контекстов переберут каждый поток.

Параметры

Thread Номер, идентифицирующий Поток, приоритет которого требуется изменить. Этот Номер является результатом функции CreateThread(), полученным при создании данного Потока.
Priority Новый приоритет, который требуется назначить потоку. Значение приоритета может быть 0 (означает не менять приоритет) или в диапазоне от 1 (низший приоритет) до 32 (наивысший приоритет). 16 это обычный приоритет. Windows не поддерживает 32 разных уровня приоритета, вот соответствующая таблица:
  - 1: Низкий
  - между 2 и 15: Ниже среднего 
  - 16:  Средний
  - между 17 и 30: Выше среднего
  - 31: Высокий
  - 32: Критичный ко времени

Возвращаемое значение

Эта функция возвращает приоритет потока, каким он был до вызова этой функции. Это может быть полезно, если вы хотите только на короткое время повысить приоритет потока, а затем вернуть его на прежний уровень. Возвращаемое значение не обязательно то самое, которое устанавливалось с помощью функции ThreadPriority(), так как оно зависит от группирования приоритетов системой.

Пример

; Процедура, которая постоянно выполняется (заметьте,
; не используем функцию Delay, так как это остановило бы выполнение потока
; на время паузы
Procedure PrintStuff(*Interval)
    For i = 0 To 1000000000
        ; Неприятное ожидание
    Next
EndProcedure

If OpenConsole()
    thread = CreateThread(@PrintStuff(), 500)
    If thread
        ; Сделаем приоритет больше, чем у главного потока
        ; Вы наверняка заметите задержку перед выполнением
        ; печати. Теперь измените 17 на 15 (приоритет ниже обычного)
        ; и смотрите как печать выполнится немедленно
        ThreadPriority(thread, 17)
        PrintN("Ждёт завершения более приоритетного потока")
    EndIf

    PrintN("Нажмете ввод для выхода")
    Input()
EndIf

Поддерживаемые OS

Windows

<- ThreadID() - Оглавление Thread - TryLockMutex()->

~����T