August 22, 2007
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
August 22, 2007
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