Изменить приоритет потока ускорения в Windows

Я пытаюсь изменить приоритет потока в 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
}

редактировать: Окончательный код:

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
}

person Lodle    schedule 02.03.2009    source источник


Ответы (2)


Используйте функцию SetThreadPriority, чтобы установить приоритет потока. SetPriorityClass используется для установки приоритета процесса. Вам также необходимо изменить значения приоритета, см. документацию по SetThreadPriority для подробностей.

person Dani van der Meer    schedule 02.03.2009

Функция SetPriorityClass принимает в качестве первого параметра HANDLE, вы передаете указатель на HANDLE. Измените его на:

res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS);

или что-то эквивалентное. Ядро может сказать, что значение указателя, которое вы передали, на самом деле не является действительным дескриптором потока, потому что я предполагаю, что оно поддерживает внутренний список выделенных в данный момент дескрипторов потока. Указателя явно нет в этом списке. Компилятор не может на самом деле обеспечить лучшую безопасность типов, поскольку HANDLE является своего рода непрозрачным типом - вам просто нужно быть очень осторожным с тем, что вы передаете.

Да, кстати, другой комментатор Дэни прав, SetPriorityClass не используется для установки приоритета потока, вы все равно хотите использовать SetThreadPriority. Но тогда мой совет останется в силе, вам нужно передать HANDLE, а не указатель на такой.

person 1800 INFORMATION    schedule 02.03.2009
comment
Дело в том, что я возился с кодом заранее, а не исправлял его. Но спасибо за вашу помощь в любом случае. :П - person Lodle; 02.03.2009