Изменить приоритет потока ускорения в Windows
-
03-07-2019 - |
Вопрос
Я пытаюсь изменить приоритет потока в Boost, но мне не повезло.Я получаю ошибку неправильного дескриптора (тип 6) от функции GetLastError.Я думал, что функция own_handle() вернула дескриптор потока?
Кто-нибудь знает, как это сделать?
void baseThread::applyPriority(uint8 priority)
{
#ifdef WIN32
if (!m_pThread)
return;
BOOL res;
HANDLE th = m_pThread->native_handle();
switch (priority)
{
case REALTIME : res = SetPriorityClass(th, REALTIME_PRIORITY_CLASS); break;
case HIGH : res = SetPriorityClass(th, HIGH_PRIORITY_CLASS); break;
case ABOVE_NORMAL : res = SetPriorityClass(th, ABOVE_NORMAL_PRIORITY_CLASS); break;
case NORMAL : res = SetPriorityClass(th, NORMAL_PRIORITY_CLASS); break;
case BELOW_NORMAL : res = SetPriorityClass(th, BELOW_NORMAL_PRIORITY_CLASS); break;
case IDLE : res = SetPriorityClass(th, IDLE_PRIORITY_CLASS); break;
}
if (res == FALSE)
{
int err = GetLastError();
}
#endif
}
редактировать:Окончательный код:
void baseThread::applyPriority(uint8 priority)
{
#ifdef WIN32
if (!m_pThread)
return;
BOOL res;
HANDLE th = m_pThread->native_handle();
switch (priority)
{
case REALTIME : res = SetThreadPriority(th, THREAD_PRIORITY_TIME_CRITICAL); break;
case HIGH : res = SetThreadPriority(th, THREAD_PRIORITY_HIGHEST); break;
case ABOVE_NORMAL : res = SetThreadPriority(th, THREAD_PRIORITY_ABOVE_NORMAL); break;
case NORMAL : res = SetThreadPriority(th, THREAD_PRIORITY_NORMAL); break;
case BELOW_NORMAL : res = SetThreadPriority(th, THREAD_PRIORITY_BELOW_NORMAL); break;
case IDLE : res = SetThreadPriority(th, THREAD_PRIORITY_LOWEST); break;
}
#endif
}
Решение
Используйте функцию SetThreadPriority, чтобы установить приоритет потока.SetPriorityClass используется для установки приоритета процесса.Вам также необходимо изменить значения приоритета, см. документацию для SetThreadPriority для получения подробной информации.
Другие советы
А SetPriorityClass
Функция принимает в качестве первого параметра HANDLE, вы передаете указатель на HANDLE.Измените его на:
res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS);
или что-то эквивалентное.Ядро может определить, что переданное вами значение указателя на самом деле не является допустимым дескриптором потока, потому что я предполагаю, что оно поддерживает внутренний список выделенных в данный момент дескрипторов потоков.Указатель явно отсутствует в этом списке.Компилятор не может обеспечить лучшую безопасность типов, поскольку HANDLE — это своего рода непрозрачный тип — вам просто нужно быть очень осторожным с тем, что вы передаете.
Да, кстати, другой комментатор Дэни прав: SetPriorityClass
не используется для установки приоритета потока, вы хотите использовать SetThreadPriority
в любом случае.Но тогда мой совет останется в силе: вам нужно передать HANDLE, а не указатель на него.