Подтвердить что ты не робот

Изменение приоритета приоритета потока в 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
}

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
}
4b9b3361

Ответ 1

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

Ответ 2

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

res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS);

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

О, кстати, другой комментатор Dani прав, SetPriorityClass не используется для установки приоритета потока, вы все равно хотите использовать SetThreadPriority. Но тогда мой совет все равно будет стоять, вам нужно пройти в РУЧКУ, а не указатель на такой.