Изменить приоритет ускорения потока в Windows - PullRequest
23 голосов
/ 02 марта 2009

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

Ответы [ 2 ]

18 голосов
/ 02 марта 2009

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

3 голосов
/ 02 марта 2009

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

res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS);

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...