· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› 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

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


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