www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Thread-priodities

reply Charma <Motoko_Kusanagi web.de> writes:
Hello,
i am currently working on a little programm which will use threads... I 
want to start two threads, one with the same priority as the programm 
itself and one with very low priority.
As i found in phobos, there is this setPriority() function but i can't 
input a number or somthing in there only INCREASE and DECREASE and so on...
Does anyone know how many steps there are from lowest to highest 
priority and how to use this function? if i want to lower the priority 
of one thread by two, do i need to run the function twice with decrease 
or will it end up the same?!
THanks for any help, Sorry for my engrish :)

Greeds,

Charma
Aug 22 2007
parent Regan Heath <regan netmail.co.nz> writes:
Charma wrote:
 Hello,
 i am currently working on a little programm which will use threads... I 
 want to start two threads, one with the same priority as the programm 
 itself and one with very low priority.
 As i found in phobos, there is this setPriority() function but i can't 
 input a number or somthing in there only INCREASE and DECREASE and so on...
 Does anyone know how many steps there are from lowest to highest 
 priority and how to use this function? if i want to lower the priority 
 of one thread by two, do i need to run the function twice with decrease 
 or will it end up the same?!
 THanks for any help, Sorry for my engrish :)

If you look in dmd\src\phobos\std\thread.d you will find: void setPriority(PRIORITY p) { int nPriority; switch (p) { case PRIORITY.INCREASE: nPriority = THREAD_PRIORITY_ABOVE_NORMAL; break; case PRIORITY.DECREASE: nPriority = THREAD_PRIORITY_BELOW_NORMAL; break; case PRIORITY.IDLE: nPriority = THREAD_PRIORITY_IDLE; break; case PRIORITY.CRITICAL: nPriority = THREAD_PRIORITY_TIME_CRITICAL; break; default: assert(0); } if (SetThreadPriority(hdl, nPriority) == THREAD_PRIORITY_ERROR_RETURN) error("set priority"); } It seems the std.thread.setPriority function only supports 4 priority modes. SetThreadPriority, the windows api function supports: [THREAD_PRIORITY_ABOVE_NORMAL] Indicates 1 point above normal priority for the priority class. [THREAD_PRIORITY_BELOW_NORMAL] Indicates 1 point below normal priority for the priority class. [THREAD_PRIORITY_HIGHEST] Indicates 2 points above normal priority for the priority class. [THREAD_PRIORITY_IDLE] Indicates a base priority level of 1 for IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS, or HIGH_PRIORITY_CLASS processes, and a base priority level of 16 for REALTIME_PRIORITY_CLASS processes. [THREAD_PRIORITY_LOWEST] Indicates 2 points below normal priority for the priority class. [THREAD_PRIORITY_NORMAL] Indicates normal priority for the priority class. [THREAD_PRIORITY_TIME_CRITICAL] Indicates a base priority level of 15 for IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS, or HIGH_PRIORITY_CLASS processes, and a base priority level of 31 for REALTIME_PRIORITY_CLASS processes. So, the THREAD_PRIORITY_HIGHEST and THREAD_PRIORITY_LOWEST options are not available with std.thread.setPriority. You can call SetThreadPriority yourself if you want: import std.c.windows.windows; import std.thread; void main() { auto t = new Thread(); ... SetThreadPriority(t.hdl, THREAD_PRIORITY_LOWEST); } Regan
Aug 22 2007