Как установить приоритет?
Создание потока с относительным приоритетом idle:
DWORD dwThreadID;
HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, NULL, CREATE_SUSPENDED, &dwThreadID); SetThreadPriority(hThread, THREAD_PRIORITY_IDLE); ResumeThread(hThread);
CloseHandle(hThread);
CreateThread всегда создает поток с относительным приоритетом normal.
Чтобы присвоить потоку относительный приоритет idle, нужно создать приостановленный поток, передав в CreateThread флаг CREATE_SUSPENDED, а потом вызвать SetThreadPriority и установить нужный приоритет.
Приостановка и возобновление потоков:
Приостановить выполнение потока можно также с помощью вызова функции
DWORD SuspendThread(HANDLE hThread);
которая увеличивает счетчик простоев потока. При удачном выполнении функция возвращает предыдущее значение счетчика простоев или $FFFFFFFF.
Чтобы возобновить выполнение потока необходимо из другого потока вызвать функцию
DWORD ResumeThread(HANDLE hThread);
которая уменьшит счетчик простоев на единицу и если он будет равен 0, запустит поток на выполнение.
Приостановить поток можно не более чем 127 раз.
Далее нужно вызвать ResumeThread, и поток будет включен в число планируемых. Сказать заранее, когда поток получит процессорное время, нельзя, но планировщик уже учитывает его новый приоритет
Поток может сообщить системе не выделять ему процессорное время на определенный период, вызвав:
VOID Sleep(DWORD dwMilliseconds);
Эта функция приостанавливает поток на dwMilliseconds миллисекунд.
Вызывая Sleep, поток добровольно отказывается от остатка выделенного ему кванта времени.
Система прекращает выделять потоку процессорное время на период, примерно равный заданному, т.к. Windows не является системой реального времени.
Можно вызвать Sleep и передать в dwMilliseconds значение INFINITE, вообще запретив планировать поток.
Можно вызвать Sleep и передать в dwMilliseconds нулевое значение. Тогда Вы откажетесь от остатка своего кванта времени и заставите систему подключить к процессору другой поток.