Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top