2009-03-02 3 views
23

Я пытаюсь изменить приоритет потока в boost, но им не повезло. Я получаю ошибку плохого дескриптора (тип 6) из функции GetLastError. Я, хотя native_handle() вернул дескриптор потока?Изменение приоритета приоритета потока в Windows

Кто-нибудь знает, как это сделать?

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 
} 

ответ

18

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

+0

Это была глупая ошибка. Я теперь отдам его. Спасибо – Lodle

3

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

res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS); 

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

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

+0

Указатель был мной возиться с кодом перед рукой и не исправлять его. Но спасибо за вашу помощь. :П – Lodle

Смежные вопросы