Программирование >>  Формирование пользовательского контейнера 

1 ... 27 28 29 [ 30 ] 31 32 33 ... 156


ft4oronoT04HOCTb 93

В среде Visual C++7/NET следует выполнить те же действия, только в меню выбрать команду Project Properties (Проект Свойства).

Приостановка и возобновление потока

Поток выполнения можно приостановить, вызвав функцию SuspendThread (), и возобновить с помощью функции ResumeThread (). ПроТОТИПЫ ЭТИХ функций приведены далее.

JJJJORD SuspendThread (HANDLE hThread) ; DWORD ResumeThread(HANDLE hThread);

В обеих функциях дескриптор потока передается в параметре hThread.

Каждый поток выполнения связан со своим счетчиком отсрочки (suspend count). Если этот счетчик равен нулю, поток не приостановлен. Если у счетчика ненулеюе значение, значит, поток отложен. Каждый вызов функции SuspendThread () увеличивает счетчик отсрочки на единицу. Каждый вызов функции ResumeThred () уменьшает его. Отложенный поток возобновится, но только когда счетчик отсрочки достигнет нуля. Следовательно, для возобновления приостановленного потока в программе должно быть равное

количество вызовов функций SuspendThread () И ResumeThred ().

Обе функции возвращают упомянутое ранее значение счетчика отсрочки потока или -1 при возникновении ошибки.

Изменение приоритета потока

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

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

Классы приоритета

По умолчанию процессу присваивается класс нормального уровня приоритета, и большинство программ остаются на этом уровне в течение всего Времени их выполнения. Несмотря на то, что ни в одном примере, описанном



в этой главе, не меняется класс приоритета, для общего развития приведем краткий обзор классов приоритета.

В операционной системе Windows определено 6 классов приоритета, которым соответствуют именованные константы, перечисленные далее в порядке от наивысшего приоритета к низшему:

□ REALTIME PRIORITY CLASS

□ HIGH PRIORITY CLASS

□ ABOVE NORMAL PRIORITY CLASS

□ NORMAL PRIORITY CLASS

□ BELOW NORMAL PRIORITY CLASS

□ IDLE PRIORITY CLASS

Программы no умолчанию получают уровень normal priority class. Как правило, у вас нет необходимости изменять этот уровень приоритета. Изменение класса приоритета процесса может иметь негативные последствия для общей производительности компьютерной системы. Например, если вы повысите класс приоритета профаммы до уровня realtime priority class, она будет всецело занимать процессор. Для некоторых специализированных приложений, возможно, вам придется повышать класс приоритета, но обычно в этом нет нужды. Как уже упоминалось ранее, в профаммах, приведенных в этой главе, класс приоритета не меняется.

Если же вы все-таки захотите изменить класс приоритета профаммы, можно сделать это с помощью функции setpriorityciass (). Текущий класс приоритета возвращает функция GetPriorityciassO. Прототипы этих функций приведены далее.

DWORD GetPriorityClass(HANDLE hApp);

DWORD SetPriorityClass(HANDLE hApp, DWORD priority);

Параметр hApp - дескриптор процесса. Функция GetPriorityciass () возвращает текущий класс приоритета или О в случае ошибки. В функции SetPriorityClassо параметр priority содержит новое значение класса приоритета для процесса.

Приоритеты потоков

В любом классе приоритета индивидуальный приоритет потока определяет, сколько времени получит поток в своем процессе. Когда поток создается впервые, он получает нормальный приоритет, но вы можете изменить его - даже во время выполнения потока.

Текущее значение приоритета потока можно узнать, вызвав функцию GetThreadPriorityO. Изменить ЭТО значение можно с помощью функции setThreadPriority (). Далее показаны прототипы этих функций:

BOOL SetThreadPriority(HANDLE hThread, int priority); BOOL GetThreadPriority(HANDLE hThread);



Именованная константа

Числовое значение

THREAD PRIORITY TIME CRITICAL

THREAD PRIORITy HIGHEST

THREAD PRIORITy ABOVE NORMAL

THREAD PRIORITy NORMAL

THREAD PRIORITY BELOW NORMAL

THREAD PRICRITY LOWEST

THREAD PRIORITY IDLE

Эти значения служат инкрементами или декрементами для класса приоритета процесса. Комбинируя приоритет класса и приоритет потока, операционная система Windows предлагает 31 возможное значение для программ-приложений.

Функция GetThreadPriorityo ВОЗВращаеТ THREAD PRIORITY ERROR RETURN,

если возникает ошибка.

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

Получение дескриптора основного потока

Можно управлять выполнением основного потока. Для этого вам надо получить его дескриптор. Легче всего сделать это, вызвав функцию GetcurrentThread о, прототип которой приведен далее.

HANDLE GetCurrentThread(void);

функция возвращает псевдодескриптор активного потока. Псевдодеск-Риптор - это предопределенное значение, которое всегда ссылается на основной поток, а не на вызывающий поток. Он может использоваться везде, Де применяется обычный дескриптор.

В обеих функциях параметр hThread содержит дескриптор потока. В функции setThreadPriorityo параметр priority задает новое значение приоритета потока. Если возникает ошибка, функция setThreadPriorityo возвращает О, в противном случае - ненулевое значение. Функция GetThreadPriorityo возвращает текущий приоритет потока. Возможные значения приоритета приведены в табл. 3.1 в порядке следования от наивысшего к низшему.

Таблица 3.1. Стандартные значения приоритета потока



1 ... 27 28 29 [ 30 ] 31 32 33 ... 156

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика