· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Приоритет треда

Посл.отвђт Сообщенiе


Дата: Июл 4, 2003 20:30:56

Выполненяем следующий код
invoke CreateThread,NULL,1000,Thread_IR,0,0,ID_Thread
mov    [TH],eax
invoke SetPriorityClass,[hinstance],REALTIME_PRIORITY_CLASS
invoke SetThreadPriority,[TH],THREAD_PRIORITY_TIME_CRITICAL
invoke GetThreadPriority,[TH]
_debug; преобразование еах в строку и вывод её в мессажбокс

в результате уровень привелегий(приоритета) треда TH = 15. На сколько я понял функция SetThreadPriority,[TH],THREAD_PRIORITY_TIME_CRITICAL для классов с приоритетом REALTIME_PRIORITY_CLASS должна установить приоритет = 31. Но проблема в том, что SetPriorityClass возвращает ошибку.
hinstance - значение возвращаемое функцией GetModuleHandle
Ответьте пожалуйста в чём моя ошибка.
У меня стоит Win98SE.


Дата: Июл 5, 2003 00:11:52

В SetPriorityClass надо передавать не hInstance, а hProcess, который можно получить функцией GetCurrentProcess


Дата: Июл 5, 2003 00:31:09

Изменил код на
invoke GetCurrentProcess
		 
		 invoke SetPriorityClass,eax,REALTIME_PRIORITY_CLASS
		 
		
		 invoke CreateThread,NULL,1000,Thread_IR,0,0,ID_Thread
		 mov    [TH],eax

		 invoke SetThreadPriority,[TH],THREAD_PRIORITY_TIME_CRITICAL
		 invoke GetThreadPriority,[TH]
		 _debug

всё по прежнему.


Дата: Июл 5, 2003 01:53:13 · Поправил: Four-F

Второй вариант должен работать. Видимо GetThreadPriority возвращает 15 и ты думаешь, что не работает. Дело в том, что GetThreadPriority возвращает относительный приоритет, а не абсолютный. Для того чтобы узнать абсолютный надо вызвать GetPriorityClass и GetThreadPriority и в соответствии с этой таблицей вычислить абсолютный приоритет.
                           |                    Process Priority Class 
Relative Thread Priority   |  Idle    Below Normal    Normal    Above Normal    High    Real-Time 
                           |--------------------------------------------------------------------- 
Time-critical              |  15      15              15        15              15      31 
Highest                    |   6       8              10        12              15      26 
Above normal               |   5       7               9        11              14      25 
Normal                     |   4       6               8        10              13      24 
Below normal               |   3       5               7         9              12      23 
Lowest                     |   2       4               6         8              11      22 
Idle                       |   1       1               1         1               1      16 



Scheduling Priorities
Здесь есть еще одна таблица в другом формате, но суть та же.

Если же SetPriorityClass действительно возвращает ошибку, вызови GetLastError.


Дата: Июл 5, 2003 09:48:10

invoke SetPriorityClass возвращает 1 т.е. она вроде выполняет свою работу как надо, но приоритет по прежнему максимум 15.


Дата: Июл 5, 2003 12:21:54

Ну дык а я про что толкую. Ты не понял. GetThreadPriority никогда не вернет тебе число болеше чем 15, потому что она возвращает не абсолютный приоритет, который ты хочеш получить, а относительный. В твоем случае это и будет 15. Но поскольку SetPriorityClass,,REALTIME_PRIORITY_CLASS у тя отрабатывает, то это относительное 15 превращается в абсолютное 31.

Сходи по ссылке выше и внимательно почитай описание функций, кот ты используешь - врубишься.


Дата: Июл 5, 2003 13:12:51

Если я правильно понял следующая конструкция
invoke GetCurrentProcess
		 
		 invoke SetPriorityClass,eax,100h
		 
		 invoke GetCurrentThread
		 invoke GetThreadPriority,eax
		 _debug

выдаст результат 0 правильно?


Дата: Июл 5, 2003 15:45:12

Да.


Дата: Июл 6, 2003 23:50:44

Ещё вопрос, возможно глупый, процедуры вызываемые из треда(например API) выполняются с его приоритетом?


Дата: Июл 7, 2003 02:39:42

Разумеется. Если точнее, то процедуры не выполняются, а поток их выполняет и естественно со своим приоритетом.


Дата: Май 10, 2004 23:22:42 · Поправил: Oleg_SK

pas
Лазил по форуму и случайно наткнулся на этот вопрос. Хотя с того момента, когда вы его задали, прошел уже почти год, я все-таки отвечу:
Вы учитываете то, что для получения такого высокого приоритета необходимо сперва получить соответствующие привилегии? Если вы этого не сделаете, то, насколько я помню, вас не пустят выше приоритета: 15 ед. На сайте www.rsdn.ru есть интересная инфа по приоритетам.


Дата: Май 11, 2004 04:27:41

Я единственный пользователь на своём компьютере и прогу не предполагалось распространять. Если я Вас правильно понял.


Дата: Май 11, 2004 04:41:22

pas
Если я Вас правильно понял.

Наверное, неправильно. Он, очевидно, имел в виду AdjustTokenPrivileges


Дата: Май 11, 2004 17:54:33

pas
Я имел в виду AdjustTokenPrivileges...;)
Привилегия: SE_INC_BASE_PRIORITY_NAME
Привилегия используется для повышения базового приоритета процессов до уровня Realtime. Используется во всех функциях создания процесса и установки его базового приоритета, где приоритет устанавливается равным REALTIME_PRIORITY_CLASS. Если пользователь не имеет соответствующей привилегии, процесс всегда запускается с приоритетом не больше HIGH_PRIORITY_CLASS.

P.S.: Кстати, в моем предыдущем посте есть описка. На самом деле, я хотел сказать, что на сайте www.rsdn.ru есть интересная информация по привилегиям.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.217