2009-03-02 39 views
23

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

3

SetPriorityClass函数将第一个参数作为HANDLE参数传递给一个HANDLE指针。将其更改为:

res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS); 

或其他等效物。内核可以告诉你传入的指针值不是一个真正有效的线程句柄,因为我猜它维护着一个当前分配的线程句柄的内部列表。指针显然不在该列表中。编译器不能真正执行更好的类型安全性,因为HANDLE是一种不透明类型 - 你只需要非常小心你通过什么。

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

+0

指针的事情是我搞乱了代码,没有修复它。但感谢您的帮助。 :P – Lodle 2009-03-02 06:51:31