Ответ 1
Используйте функцию SetThreadPriority для установки приоритета потока. SetPriorityClass используется для установки приоритета процесса. Вы также должны изменить значения приоритета, подробнее см. Документацию для SetThreadPriority.
Я пытаюсь изменить приоритет потока в boost, но им не повезло. Я получаю ошибку плохого дескриптора (тип 6) из функции GetLastError. Я, хотя native_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
}
edit: Конечный код:
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, вы передаете указатель на РУЧКУ. Измените его на:
res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS);
или что-то подобное. Ядро может сказать, что значение указателя, которое вы передали, на самом деле не является допустимым дескриптором потока, потому что я предполагаю, что он поддерживает внутренний список выделенных в текущий момент ручек потоков. Указатель явно не входит в этот список. Компилятор не может реально обеспечить лучшую безопасность типов, поскольку РУЧКА - это непрозрачный тип - вам просто нужно быть очень осторожным, что вы проходите.
О, кстати, другой комментатор Dani прав, SetPriorityClass
не используется для установки приоритета потока, вы все равно хотите использовать SetThreadPriority
. Но тогда мой совет все равно будет стоять, вам нужно пройти в РУЧКУ, а не указатель на такой.