在Windows中更改提升线程优先级

时间:2009-03-02 05:17:29

标签: c++ windows multithreading winapi boost

我试图改变提升中的线程优先级,但我没有运气。我从GetLastError函数得到一个错误的句柄错误(类型6)。我虽然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 个答案:

答案 0 :(得分:18)

使用SetThreadPriority函数设置线程优先级。 SetPriorityClass用于设置进程的优先级。您还必须更改优先级值,有关详细信息,请参阅SetThreadPriority的文档。

答案 1 :(得分:3)

SetPriorityClass函数将第一个参数作为HANDLE,你传入一个指向HANDLE的指针。将其更改为:

res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS);

或类似的东西。内核可以告诉您传入的指针值实际上不是有效的线程句柄,因为我猜它维护了当前分配的线程句柄的内部列表。指针显然不在该列表中。编译器无法真正实现更好的类型安全性,因为HANDLE是一种不透明的类型 - 你只需要非常小心你传入的内容。

哦顺便说一句,其他评论者Dani是正确的,SetPriorityClass不用于设置主题的优先级,你想要使用SetThreadPriority。但是我的建议仍然存在,你需要传递一个HANDLE,而不是指向这样的指针。